В этом задании вы напишете бота, который сыграет дилемму заключенного. Вот подвох: у вас не будет доступа к истории предыдущих игр. Вместо этого у вас будет доступ к самому противнику. В этой версии оба игрока получают +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
ошибке, а не к бесконечному циклу, который никогда не завершается. Если это может привести к aStackOverflow
, убедитесь, что вы добавили оператор try-catch. Для примера рекурсии, которая не достигает ошибкиthem(() => 'C')
не приведет к ошибке, потому что, когда противник вызываетthem
, он вызывает() => 'C'
функцию. Единственное, что нужно обернуть,try-catch
это если вы вызываетеthem
с параметром некоторой функции, которая вызываетthem
с параметром некоторой функции, которая вызываетthem
и т.д. (бесконечно). Например,them(t => t(() => 'C'))
будет играть то, что будет играть противник, если противник думает, что он играетnice
. Там нет возможностиstackoverflow
ошибки.Ответы:
Boombot
Если противник запускается первым и вызывает это без
try..catch
, этот бот автоматически выигрывает 3 очка. Ноль очков в любом другом случае.источник
археоптерикс
cooperate
, имитируют движение противникаdefect
.defect
или сnice
, то дефект.Что делает это хорошей стратегией? Не имею представления. Я сгенерировал его, используя эволюционный алгоритм, частично обученный текущим представлениям.
Tiktaalik
cooperate
, тогда инвертируйте ход противникаdefect
.defect
, то дефект.notNice
.Еще одна эволюционно сгенерированная стратегия.
источник
WhatWouldBotDoBot
WhatWouldBotDoBot довольно прост; он просто проверяет своего оппонента на то, что он будет делать против устойчивой программы. Если бот предпочитает сотрудничать, если это возможно, WWBDB также предпочтет сотрудничество (поэтому он будет сотрудничать с хорошим ботом). WWBDB сам не предпочитает сотрудничество.
источник
Проверьте состояние
Если они призовут меня, то они, вероятно, будут действительно ими. Мы действуем как перебежчик. Если они не призовут меня, то они, вероятно, будут проверенным тестером. Мы бы действовали как лучше.
Выше оригинальный ответ. И, возможно, я должен сотрудничать, чтобы заработать больше очков.
Проверьте состояние с самоконтролем
источник
RandomBot
Потому что почему бы и нет.
источник
сложность
Сложность тестов, чтобы увидеть, является ли бот Сотрудничает или Дефект. Если это так, он сотрудничает, но если это не так, это порок. Все текущие боты, которые проверяют своих оппонентов, используют простые функции для проверки ответов, поэтому Сложность будет просто притворяться Сотрудничающей в этих случаях.
источник
То, как я хочу, чтобы это работало, всегда должно быть дефектом, за исключением случаев, когда я играю против себя. Он пытается это сделать, передав функцию «тестер», которая не привязана к ним, и пытается определить, называется ли «их» тестером. Если он называется тестером, он изменяет активированную статическую переменную на true, а затем возвращает кооперацию. Но это не работает. Я не слишком знаком с javascript и, возможно, внесу еще некоторые изменения.
источник
tester
функцию: DНе хорошо
Имитирует реакцию противника на отклонение
источник
NotNice 2
Бум-версия NotNice от FatalError .
источник
Здравый смысл
Отказ от ответственности: я вроде не знаю javascript.
Если вы можете получить прибыль от хорошего человека, сделайте это. В противном случае верните то, что вернули бы, если бы столкнулись с сотрудничеством (по крайней мере, я так думаю ).
источник
А ты куда хочешь пойти? (вдохновленный волантами в книге джунглей)
источник
this
- то же самое, что и self. Я думаю, что вы хотели сказатьreturn them(yourself)
.this
это не переменная, это ключевое слово, и в контексте функцииthis!=self
.self
будет означать объект окна иthis
саму функцию (всегда относится к контексту, в котором она находится, поэтому она не рассматривается как переменная). Вот почему наличиеvar self = this;
в начале многих примеров кода может рассматриваться как вводящее в заблуждение. Добавлена версия без «этого»this
не относится к функции.yourself
иyourself_no_this
бегать по-разному.this
в основном никогда не ссылается на функцию в JavaScript. См .: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Наказывать инспекторов
Дайте боту код и посмотрите, запускает ли он его. Если он запускался более одного раза, бот злой инспектор, и мы должны уйти! Если он запускался ровно один раз, играйте как нехороший бот. Если он никогда не был запущен, сотрудничайте.
история
Что бы последний бот, которого я видел, сделал против этого оппонента?
Результаты турнира на 10000 раундов:
источник
Мал пытается определить, находится ли он внутри симуляции или нет. Если это так, он предполагает, что в конечном итоге ему будет передан настоящий код
them
, и пробует различные стратегии, чтобы убедить их сотрудничать.Если он не знает наверняка, он проверяет, может ли он получить дефект бесплатно, или, если нет, пытается скопировать то, что
them
будет делать, если ему предоставлен сотрудник.источник
TrickyBot
Постарайся быть непредсказуемым
источник
selfapply
Не уверен, имеет ли это какой-то смысл, но это кажется интересным! Делай с тобой, как с собой, повторяй, чтобы поймать случайность. Если это не сработает, будь милым.
Не проверенный, и мой первый код JavaScript, и более сложный, чем я ожидал.
источник
selfapply(selfapply)
звонкиselfapply(selfapply)
!RandomAlternate
Итак, я узнал, как использовать свойства для государства ...
источник
Убийство Бот № 1
Вызывает бесконечный цикл, в котором более вероятно, что противник будет обвинен.
источник
Платиновое Правило Бот
Платиновое правило гласит: «Относись к другим так, как они хотят, чтобы к ним относились». Мой бот учитывает это. Что бы они ни делали для себя, что, как мы предполагаем, это то, как они хотели бы, чтобы относились к нам, мы делаем с ними. Если они выдают ошибку, мы предполагаем, что они хотят сотрудничать.
источник
TheGolfedOne (название функции:
a
), 63 байтаГольф-код трудно читать. Из-за этого
them
сломается.Я не до конца понимал механику под этим KotH, но я полагаю, что если противник не имеет статуса, мне просто нужно сломать их, пока я дефект.
Результат его первого турнира (я не удосужился использовать всех ботов, извините)
Он не так плох, как я думал, 3-е место (среди тех) с первой попытки.
Вторая попытка,
a
снова получил 260, снова 3-е место, сноваonlyTrustYourself
иdefect
снова. Это может быть последовательным в конце :)PS: Я не так хорош в гольфе, так что это больше для шутки, чем что-либо еще. Здесь я только сократил имена переменных, имя функции и удалил как можно больше пробелов.
источник
Карма
Если противник будет сотрудничать с нами, то мы будем сотрудничать. Если они попытаются уйти, когда мы сотрудничаем, мы также уйдем.
источник