在这个挑战中,您将编写一个扮演囚徒困境的机器人。要注意的是:您将无法访问以前的游戏历史。相反,您将可以访问对手本身。在此版本中,如果两个玩家都合作,则他们将获得+2分;如果两个人都缺憾,则将获得+1分;如果一个人合作但一个缺陷,则叛逃者将获得+3分,而另一位则无分。每个提交将与其他每个提交(包括自身)进行10次播放。获胜者是总分最高的作品。
控制器:您应该以以下形式编写一个javascript函数
function submissionName(them) {
/* Your code here */
}
控制器使用函数的name
属性来显示结果,因此如果它不是这种格式(而是f = x => ...
或f = function() { ... }
),则将很难看到您的分数,并且您将无法访问自己的函数。
该函数将接受一个参数:them
这是对手的函数。然后,它可以调用该函数,以查看将给定某些函数作为输入的对手的反应。根据这些数据,您必须分别返回“ C”或“ D”以进行合作或出现缺陷。
示例(将竞争):
function cooperate(them) {
return 'C';
}
function defect(them) {
return 'D';
}
function nice(them) {
// Do whatever they would do when faced with a cooperator
return them(wrap(_ => 'C'));
}
控制器在这里可用
规则:
- 您将无法看到对手的密码本身。所有功能都进行了包装,以使它们在出现时看起来相同
toString()
调用。检查对手(可能是您自己)的唯一方法是测试对手。 - 您的功能不必是确定性的。您只能通过在自己的函数中设置属性来保存状态,例如
submissionName.state = {};
。但是,在比赛之间(甚至在同一位球员的比赛之间),通过调用toString()
和清除状态eval
。因此,没有以前的比赛的记忆。 - 在每个匹配中首先调用哪个功能的顺序是随机的。
- 如果您的代码抛出错误,那么它将被视为您在对手叛逃时进行了合作。如果您是第一个跑步的人,则甚至不会调用对手的密码。即使在呼叫时对手代码中发生错误,也会发生这种情况
them
。注意堆栈溢出错误,尤其是在您的代码调用时them(wrap(submissionName))
,因为它们可能会这样做。 self
当eval
调用该函数时,您可能无法访问该变量或碰巧在范围内的任何其他变量wrap
。此功能允许您以与控制器调用功能无二的方式呼叫对手。您可能无法写信给Math
,window
等。(您可以使用诸如之类的功能Math.random()
)。- 您可能无法通过创建
Error
或通过其他方法来访问堆栈跟踪。
花费时间过长的注意事项:请避免卡在 while
永远循环。在任何给定回合中,两个竞争对手的总时间不得超过1秒。要强制执行此操作,请选择1000毫秒至2000毫秒之间的随机超时(这是通过有意等待已知的时间量来避免游戏),并且如果工作人员花费的时间长于执行时间,则会抛出错误。如果发生这种情况,将按以下方式确定错误原因:将在1000 ms之后的随机时刻暂停执行,并检查该时刻的调用堆栈。当前处于循环中(或类似循环的递归,从某种意义上来说,它是为避免堆栈溢出错误而设置的递归)而被称为最新竞争者。如果同一位竞争对手多次被指责为导致“花费太长时间”错误,则该竞争对手将被取消参赛资格。
them
必须确定/遵循规则吗?例如function me(them){let log=0;them(x=>{++log;return 'C';})
;; return log == 0?'D':'C';}
StackOverflow
错误,而不是永远不会退出的无限循环。如果可能导致StackOverflow
,请确保添加try-catch语句。对于在1秒内未达到stackoverflow错误的递归示例,您需要更多晦涩的示例,例如stackoverflow.com/q/12438786/3371119
them(() => 'C')
不会导致错误,因为当对手调用时them
,它将调用该() => 'C'
函数。唯一需要包装的内容try-catch
是,如果您them
使用某个函数them
的参数进行调用,而该函数的参数又使用某个调用了诸如此类的函数的参数进行调用them
(无限)。例如,them(t => t(() => 'C'))
如果对手以为自己在玩,就会玩对手会玩的任何东西nice
。没有stackoverflow
错误的可能性。