この課題では、囚人のジレンマを演じるボットを作成します。キャッチは次のとおりです。以前のゲームの履歴にアクセスすることはできません。代わりに、相手自身にアクセスできます。このバージョンでは、両方のプレイヤーが協力すると+2ポイントを獲得し、両方がディフェクトすると+1ポイントを獲得します。各サブミッションは、それ自体を含む他のすべてのサブミッションに対して10回プレイされます。勝者は、合計ポイントが最も多い提出物です。
コントローラー:JavaScript関数を次の形式で作成する必要があります
function submissionName(them) {
/* Your code here */
}
コントローラーは関数のname
プロパティを使用して結果を表示します。したがって、この形式ではない場合(f = x => ...
または代わりにまたはf = function() { ... }
)、スコアを確認することは難しく、独自の関数にアクセスすることはできません。
この関数は、1つのパラメーターを受け入れます。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ミリ秒後のランダムな瞬間に一時停止され、その瞬間の呼び出しスタックが検査されます。現在ループになっている(または、スタックオーバーフローエラーを回避するために設定された再帰であるという意味でのループのような再帰)、最近呼び出された競合他社が非難されます。同じ競合他社が「時間がかかりすぎる」エラーを数回引き起こしたと非難された場合、その競合他社は失格となります。
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
them(() => 'C')
、相手がthem
を呼び出すと() => 'C'
関数が呼び出されるため、エラーは発生しません。ラップする必要があるのは、(無限に)などを呼び出す関数のパラメーターで呼び出す関数のパラメーターでtry-catch
呼び出す場合だけです。たとえば、対戦相手がプレイしていると思った場合に対戦相手がプレイするものは何でもプレイします。エラーの可能性はありません。them
them
them
them(t => t(() => 'C'))
nice
stackoverflow