У цьому виклику ви напишете бота, що гра - це дилема в'язня. Ось увінок: у вас не буде доступу до історії попередніх ігор. Натомість у вас буде доступ до самого суперника. У цій версії обидва гравці отримують +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помилки.