В будущем, когда Time Travel (сокращенно TT) станет обычным явлением, подбрасывание монет станет серьезным интеллектуальным спортом. Чтобы подготовиться к будущему, мы создаем конкурс для программ, в которых путешествие во времени будет действительно происходить с точки зрения заявок.
Соревнование проводится в стиле «круговой малиновый король горы», состоящем из подбрасывания монет между классами Java.
Правила жеребьевки
- Есть два игрока и 100 раундов.
- В каждом раунде подбрасывается монета, и в зависимости от результата один из игроков получает 1 очко. Каждый игрок имеет 50% шанс набрать очко.
- После броска у обоих игроков есть возможность контролировать время, потянув за рычаги.
- Если вы потянете синий рычаг (отведите стопор), TT не будет возможен для раунда, в котором использовался рычаг, или для любого более раннего раунда. ТТ, пытающиеся пойти на эти раунды, не будут иметь никакого эффекта.
- Если вы потянете красный рычаг (ревертер), вы попытаетесь вернуть время назад к предыдущему раунду. В случае успеха память противника будет возвращена к его памяти до выбранного раунда, и результаты броска монеты, начиная с выбранного раунда, также будут удалены . Единственный возможный знак для вашего оппонента о ТТ - это количество его неиспользованных рычагов, которые не будут возвращены назад.
- Каждый игрок имеет 5 синих и 20 красных неиспользованных рычагов в начале матча. Эти рычаги не подвержены влиянию ТТ.
- Если в конце 100-го раунда ТТ не происходит, игра заканчивается, и побеждает игрок с более высоким счетом.
Детали
- Раунды имеют индексирование на основе 1 (от 1 до 100).
- Перед раундом
x
вам предоставляется количество доступных синих и красных рычагов, результаты подбрасывания монеты до ходаx
(включительно) и память о вашем (последнем)x-1
раунде. - Нажатие синего рычага в раунде
x
останавливает все ТТ, которые имеют пункт назначения в раундеx
или раньше (он блокирует ТТ, если это произойдет и в тот же самый раунд). - Возвращение к раунду
x
означает, что следующий раунд будет круглымx
. - Если оба игрока решают вернуться в конце раунда, время возвращается к более раннему месту назначения, которое не блокируется. Игроки, которые попытались вернуться к этому времени, сохранят свою память.
Технические детали
- Вы должны написать класс Java, реализующий предоставленный интерфейс Bot.
- Добавьте своего бота в проект.
- Добавьте экземпляр вашего бота
Bot
в файлController.java
. - Ваш класс не должен хранить информацию между звонками . (В большинстве случаев наличие только
final
переменных вне функций удовлетворяет этому требованию.) - Вы можете предоставить информацию контроллеру в
memory
поле вашего возвращаемогоAction
объекта. Это будет возвращено вам в следующем ходу, если ТТ не произошло. Если произойдет TT, вы получите соответствующую более раннюю память о себе. - Вы можете использовать
totalScore()
методGame
класса, чтобы получить оценку строки истории.
протокол
На каждом шагу ваш
takeTurn(...)
метод вызывается с 5 аргументами:- количество неиспользованных синих рычагов
- количество неиспользованных красных рычагов
- история бросания монеты, строка, состоящая из 1 и 0, отмечающая ваши победы и поражения в предыдущих раундах. Первый символ соответствует первому бросанию монеты. (В первом раунде длина строки будет
1
.) - строка, ваша сохраненная память из предыдущего раунда
- основанный на 1 индекс этого раунда
На каждом шагу ваш метод возвращает
Action
объект, содержащийцелое число в
move
поле, описывающем ваше действие:0
бездействовать-1
потянуть синий рычаг и блокировать ТТ, проходящие через этот раунд- положительное целое число
x
, не больше текущего раунда, чтобы потянуть красный рычаг и попытаться вернуться к раундуx
- Неверные целые числа рассматриваются как
0
.
строка, содержащая вашу память из этого раунда, которую вы хотите сохранить. Обратите внимание, что хранение памяти не является важной частью задачи . Вы можете делать хорошие записи без сохранения каких-либо полезных данных в строке. В первом раунде строка будет пустой строкой.
Ваш метод должен занимать в среднем не более 10 мс на раунд в матче.
- Регулярное нарушение сроков приводит к дисквалификации.
счет
- Победа в матче приносит 2 очка, а ничья - 1 очко для обоих игроков. Потеря не приносит очков.
- Оценка бота будет равна общему количеству набранных им очков.
- Количество матчей между каждой парой участников будет зависеть от количества участников и их скорости.
Два простых примера ботов публикуются в качестве ответов.
Контроллер и первая пара ботов доступны здесь .
Результаты теста с ботами представлены до 3 ноября.
Всего очков:
Oldschool: 3163
Random: 5871
RegretBot: 5269
Nostalgia: 8601
Little Ten: 8772
Analyzer: 17746
NoRegretsBot: 5833
Oracle: 15539
Deja Vu: 5491
Bad Loser: 13715
(Контроллер основан на контроллере Cat Catcher Challenge . Спасибо, что @flawr предоставил его в качестве основы для этого.)
Бонус: хороший 6-минутный фильм, основанный на аналогичной концепции.
источник
If you pull a blue lever (revert stopper) no TT is possible through that round anymore. TT's attempting to go through the round will have no effect.
Что такое "прохождение раунда"?If you pull a blue lever (revert stopper) no TT is possible to the round the lever was used or any earlier round anymore. TT's attempting to go to these rounds will have no effect.
Ответы:
анализатор
Это анализирует прошлое, чтобы сделать лучшие прогнозы на будущее.
РЕДАКТИРОВАТЬ: Избегает синих многоуровневых раз. Эффективно использует синие рычаги. Использует красные рычаги более эффективно. Добавлен шрам на сезон Хэллоуина.
РЕДАКТИРОВАТЬ: исправлено 1 ошибка.
РЕДАКТИРОВАТЬ: улучшенная
computeWinningProbability
функция. Теперь используются красные рычаги и синий рычаг более агрессивно.Оценка (со 2 ноября):
источник
Ностальгия
Не проверено, просто быстрый удар по попытке сделать бота, которого трудно заблокировать (потому что он решает, когда тянуть красный рычаг в основном случайным образом), но это принимает достойные решения.
Изменить: я пропустил это правило:
Это кажется хорошей причиной для использования памяти - если вы помните, что пытались провести ТТ до данного раунда, возможно, вы потерпели неудачу, поэтому вам не следует пытаться снова провести ТТ до этого раунда. Отредактировал мой бот, чтобы попытаться избежать этого.
источник
оракул
Я беззастенчиво скопировал некоторый код из Analyzer (для анализа памяти). Это представление пытается вытащить синий рычаг рано, а затем медленно наращивает свое лидерство. Я думаю, что производительность этого бота компенсирует уродливый код :)
источник
RegretBot
В конце
нашей жизниматча мы сожалеем о наших прошлых неудачах и пытаемся вернуться и исправить их.источник
Маленькая десятка
Little Ten много умножает и делит на 10, используя числа, кратные 10, и возвращаясь к раундам, кратным 10.
Изменить: Немного изменили механику теперь, когда объяснение того, что происходит, когда синий рычаг нажал, стало более понятным. Также сделал немного ребалансировки.
источник
случайный
Стратегия Рэндома заключается в следующем:
источник
NoRegretsBot
источник
Плохой неудачник
Этот бот не использует память и на удивление хорош (но он не побеждает Analyzer или Oracle).
источник
Старая школа
Этот бот никогда не делает никаких действий, так как Oldschool не верит в путешествия во времени.
источник
Deja Vu Bot
Этот бот пытается отследить, когда он тянет синих, чтобы избежать красных тянет в эту область. Тянет только красные рычаги, когда значительно отстают в счете.
источник