Охота за пасхальными яйцами
Бот найти яйцо, прежде чем кролик найдет яйцо. Бот счастлив.
обзор
Это испытание царя горы в честь Пасхи и традиции охоты за пасхальными яйцами!
Ваш бот видит два пространства в каждом направлении, включая диагонали, создавая вокруг себя квадрат 5х5, который вы можете видеть. Он ищет яйца, и тот, кто найдет больше всего яиц, победит!
Доска
Доска будет состоять из o
s, которые являются пасхальными яйцами, #
s, которые являются стенами, *
s, которые являются другими игроками, и s, которые являются пустыми местами.
- Это будет квадрат с длиной ребра
(number of entries) * 3
. - Он будет окружен стенами.
- Внутри стен будет ассортимент случайно расположенных прямых линий
#
, которые будут иметь произвольную длину от 2 до 10 включительно. Там будет(number of entries) * 3
из них. - Яйца будут размещены в случайном порядке. Их будет
(number of entries) * 4
, и они будут генерироваться только на пустых () квадратах.
- Для правильной работы процесса создания доски должно быть не менее 7 единиц.
Вот JSFiddle, который сгенерирует случайную доску для тестирования. Вот пример с (number of entries) = 7
:
#####################
# o ##
# # o ##
# #o ###### ##
###### # ##
## o # # ##
## o# #o# o o##
## #o # # o # #
## # o # # # #
## ## # # o # #
## # # o # # #
## # o # ## # # #
## # # # #
# o # ## # #
# o oo ##o #
#o ####### oo ## #
# # # #
# o o o# #
# o #### o o#
# #
#####################
После того, как доска сгенерирована, каждый игрок размещается на случайном квадрате (пустое место).
вход
Вы возьмете шесть строк ввода. Первые пять строк - это ваше поле зрения (пробелы за пределами поля будут обозначены X
, а среднее пространство всегда будет *
вами), а шестая строка будет пустой (сначала).
Выход
Вы выведете три строки. Во-первых, направление, в котором вы хотите двигаться:
1 2 3
8 YOU 4
7 6 5
(9 - нет, если вы не хотите двигаться), секунда, одна из A
ttack, C
ounter или N
othing (скоро это будет подробно объяснено), а в качестве строки thrid будет любая строка длиной до 1024 Это будет память вашего бота. Вы можете использовать его по своему усмотрению или оставить его пустым. Эта память станет шестой строкой ввода вашей программы при следующем запуске.
Все дальнейшие строки вывода игнорируются, и если есть только одна строка, вторая считается пустой.
перемещение
Следующий процесс используется, чтобы определить, куда вы переехали:
- Если при перемещении вы окажетесь в пустом месте (
), ваш игрок будет помещен в это пространство.
- Если вы окажетесь в стене (
#
), ваш ход игнорируется, и вы теряете свой ход. - Если вы попадете в egg (
o
) или player (*
), эта информация будет сохранена и будет использоваться после того, как все переехали.
После того, как все переехали, двусмысленности разрешаются.
Если в одном месте приземлились два игрока, происходит драка! Это где A
/ C
/ N
приходит играть. A
ttack бьет N
ничто (обычная атака), N
ничто бьет по C
аунтеру (вы ничего не можете противостоять), а C
ounter бьет по A
ttack (контратака). Игрок, выигравший этот бой, остается на своем поле, а игрок, проигравший, возвращается к исходному полю, на котором он начал. В случае ничьей оба игрока возвращаются туда, где они были.
Если проигравший или привязанный игрок возвращается туда, где он был, и там есть другой игрок, битва не происходит, и другой игрок также возвращается в исходное пространство. Если в этом пространстве есть другой игрок, этот игрок возвращается, и это продолжается до тех пор, пока все игроки не окажутся в разных местах.
Если на одном поле находятся три или более игроков, они все возвращаются на свои исходные позиции.
Если какой-либо игрок все еще стоит на яйце ...
- Если игрок выбрал
A
, яйцо уничтожено. - Если игрок выбрал
C
, ничего не происходит, и игрок возвращается к своему первоначальному пространству. - Если игрок выбрал
N
, игрок поднимает яйцо! Счет игрока увеличивается на единицу, и яйцо удаляется.
Языки
Вы можете использовать любой язык, который свободно доступен в Windows, OSX и Linux, чтобы обеспечить честность среди каждого участника. Если код не может быть свободно запущен, но его можно скомпилировать или упаковать в такой формат, пожалуйста, включите этот формат в свой ответ. В идеале, если вы можете скомпилировать свой код на более общий язык (например, CoffeeScript -> JavaScript), сделайте это.
счет
Ваш счет будет средним числом яиц, которые вы соберете из десяти пробежек. Пробег заканчивается, когда все яйца собраны или когда (number of entries * 25)
пройдены очереди. Я вручную позабочусь о том, чтобы можно было достать все яйца для каждой карты (постоянно генерируя карты, пока все яйца не будут доступны).
Табло
Табло будет добавлено, когда будут выполнены все следующие условия:
- Было подано как минимум семь действительных заявок с положительным или нулевым баллом (без оценок)
- С момента создания этого задания прошло не менее 48 часов (UTC 14:23)
Правила не изменятся в течение этого предсоревновательного периода, за исключением добавления пояснений, где правило было неясным. После того, как табло будет выставлено, здесь также будет размещена программа тестирования, чтобы вы могли проверить свои записи. Код тестирования для этого все еще находится в стадии разработки, но он воспроизводим и работает. Вот репозиторий GitHub.
источник
9
, он никогда не сможет подвергнуться значимой атаке. Если другой игрок (B) выйдет на этот квадрат игроков и выиграет, A будет перемещен обратно на свой первоначальный квадрат (который такой же). Но теперь происходит столкновение, потому что там есть и А, и В, поэтому В должен вернуться на свою собственную клетку. Таким образом, результат не зависит от фактического боя, B всегда возвращается на начальную клетку, а A всегда остается на месте. Это позволило бы мне написать оба, которые могли бы помочь другому представлению, блокируя путь для всех остальных.Ответы:
Cart'o'Gophers
Вот еще одна заявка - и эта на самом деле предназначена для того, чтобы быть конкурентоспособной. Опять же, это в Ruby. Так что запустите это с
ruby cartogophers.rb
. Это заняло намного больше времени, чем ожидалось ...Этот бот запоминает то, что видел раньше, и пытается построить большую карту на каждом ходу. Затем он использует поиск в ширину ближайшего яйца и направляется туда. Если на текущей карте нет яйца, которое можно достать, бот направляется к ближайшему открытому краю своей карты (чтобы быстро развернуть карту в направлении, в котором она все еще может двигаться).
Этот бот еще не имеет понятия о других ботах и стратегии боя. Поскольку я не нашел надежного способа определить, был ли мой ход успешным, это может вызвать некоторые проблемы. Я просто всегда предполагаю, что перемещение было успешным - поэтому, если это не было, новые патчи будут загружены в карту в неправильных местах, что может или не может быть вредным для поиска пути.
Бот использует память для хранения карты и ее новой позиции на карте (при условии, что движение будет успешным). Карта хранится без разрывов строк, заархивирована и закодирована в формате base64 (вместе с количеством строк на карте, чтобы можно было повторно вставить разрывы строк). Это сжатие приводит к уменьшению размера примерно до трети несжатой карты, поэтому, имея тень более 1000 байт, я мог бы хранить карту размером около 3000 ячеек, что примерно соответствует полному исследованию карты с 18 ботами. До тех пор, пока нет такого большого количества представлений, я не думаю, что смогу найти решение для этого случая.
После нескольких тестовых прогонов против 5dumbbot
с и 1naivebot
(моя другая заявка), он либо работал очень плохо (например, 1 или 2 яйца), либо значительно превосходил остальные (7-9 яиц). Я могу подумать о лучшей стратегии борьбы и о том, как я могу определить, действительно ли я переехал или нет. Оба могут улучшить счет.Ох, и если вы задаетесь вопросом о названии бота, вы должны прочитать Орден The Stick ( последняя панель на этом комиксе ).
РЕДАКТИРОВАТЬ: было несколько ошибок с обнаружением краев обнаруженной карты. Теперь, когда я их исправил, этот бот всегда получает оценки примерно
20
5dumbbot
с и 1naivebot
. Это больше походит на это! Если вы добавите$stderr.puts map
мой бот сейчас, вы действительно сможете увидеть, как он систематически раскрывает карту и собирает все яйца за это время. Я также решилA
вместо того, чтобыN
не наступать на яйцо, выбирать , чтобы уменьшить вероятность возвращения обратно к первоначальной клетке бота (что частично портит карту).(Это не так хорошо работает против 6
naivebot
с, тем более, что очень возможно оказаться в «тупике» с другим ботом, когда они оба неоднократно хотят схватить яйцо и выбратьN
. Мне нужно подумать об этом ... )источник
Java Банни
Этот кролик еще не закончил расти (я все еще планирую внести изменения), но сейчас это отправная точка. Он ищет ближайшее яйцо и идет к нему. Не обнаружено ни стен, ни за пределами границ (пока). Он пойдет, чтобы забрать яйцо, на которое он приземлится, но в противном случае он попытается оттолкнуть его и напасть на что-нибудь еще. Если поблизости нет яиц, он пойдет за ближайшим кроликом. Они могут знать то, что он не знает. В противном случае он просто выберет случайное направление для ходьбы. И он довольно забывчивый (не использует переменную памяти).
Планы продвижения вперед:
Обновление 1 Мой кролик пойдет за другими кроликами, если не увидит яйцо. Также переработал код «найди ближайшее яйцо» в свой собственный метод.
источник
N
aiveBot (в рубине)Вот очень упрощенный бот для запуска яиц (мы хотим быстро выполнить эти 7 заявок, верно?). Мой Ruby не очень идиоматичен, поэтому этот код может заставить настоящих рубинистов съежиться от боли. Читайте на свой страх и риск.
Беги с
ruby naivebot.rb
.Я просто жестко запрограммировал несколько случаев, когда яйцо видно и не заслонено стеной. Это даже не касается ближайшего яйца, но выбирает первый ход, который имеет смысл. Если такого яйца не найдено, бот делает случайный ход. Он игнорирует всех других игроков и никогда не атакует и не противостоит.
источник
WallFolower
(преднамеренное каламбур) в Python 3 :
Переходит к яйцу, если в поле зрения есть яйцо, но только если оно ближе к этому яйцу, чем другой робот. Если на расстоянии есть связь, она все равно идет на это. В противном случае следует ли стена LH (в настоящее время не очень хорошо реализована).
Еще нужно поработать над стеной следите, но я все равно выложу здесь.
источник
sys.exit(0)
наexit(0)
? Кроме того, мне нужно поработать над этим (прямо сейчас, он предполагает, что сам является ``), но у меня действительно нет времени. Когда у меня будет время, я приду и исправлю это.