У цьому виклику ви напишете бота, що гра - це дилема в'язня. Ось увінок: у вас не буде доступу до історії попередніх ігор. Натомість у вас буде доступ до самого суперника. У цій версії обидва гравці отримують +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 мс, і стек виклику в цей момент буде перевірений. Звинувачується останній закликаний конкурент, який зараз знаходиться в циклі (або циклічна рекурсія, в тому сенсі, що це рекурсія, створена для уникнення помилки переповнення стека). Якщо одного і того ж конкурента звинувачують у тому, що він кілька разів спричинив помилку "зайняття занадто довго", його буде дискваліфіковано.
them
бути детермінованою / виконувати правила? Наприклад function me(them){let log=0;them(x=>{++log;return 'C';})
; return log == 0? 'D': 'C';}
StackOverflow
помилки, а не нескінченного циклу, який ніколи не вимикається. Якщо це може призвести до StackOverflow
, обов'язково додайте заяву про спробу. Для прикладу рекурсії , яка не досягає помилки StackOverflow в протягом 1 секунди, вам потрібно більше неясні приклади , як stackoverflow.com/q/12438786/3371119
them(() => 'C')
не призведе до помилки, оскільки, коли противник дзвонить them
, він викликає () => 'C'
функцію. Єдине, що потрібно завершити, try-catch
це, якщо ви зателефонуєте them
з параметром якоїсь функції, яка викликає them
параметр якоїсь функції, яка викликає them
і т.д. тощо (нескінченно). Наприклад, them(t => t(() => 'C'))
грали б те , що грав суперник, якби противник думав, що грає nice
. Немає можливості stackoverflow
помилки.