Вы шар слизи. Естественно, будучи слизью, вы хотите растопить как можно большую площадь. Но есть 3 других слизи, которые хотят сделать то же самое. Кто будет превосходной слизью?
Описание
Все слизи будут собраны на одной арене. Судьи (т.е. контрольная программа) просматривают исчерпывающий список всех возможных комбинаций 4-слизи, размещают их по углам стола и наблюдают, чтобы увидеть, какая слизь вытекает из большей части области.
Ваши слизи могут выполнять одно из 3 действий каждый ход: разбрасываться, прыгать или сливаться. Дальнейшее описание того, что они означают, будет предоставлено в разделе « Вывод ».
Доска / арена
Арена будет квадратной доской (в настоящее время 8x8, но это может измениться в будущем). Вот пример арены развивающейся игры:
11111222
11111444
11.22444
.1222.4.
333.3244
33333.44
333...44
333....4
Слизь представлена числами от 1 до 4 (игроки от 1 до 4), а пустое пространство представлено точкой ( .
). Первоначально доска начинается как все пустое пространство, за исключением одной единицы слизи игрока 1 в верхнем левом углу, игрока 2 в верхнем правом углу, игрока 3 в нижнем левом углу и игрока 4 в нижнем правом углу.
Координаты представлены на основе 0 индексом строки и столбца для удобства чтения в коде. Например, координаты (3, 6) представляют 7-й квадрат в 4-й строке (в приведенном выше примере, а 4
). (Это облегчает доступ к квадратам:. board[coords.x][coords.y]
) Вот наглядная иллюстрация:
(0, 0) (0, 1) (0, 2)
(1, 0) (1, 1) (1, 2)
(2, 0) (2, 1) (2, 2)
вход
Ввод вашей программы будет указывать, какой вы игрок (1, 2, 3 или 4), запятая ( ,
), затем содержимое поля / арены (с символами новой строки, замененными запятыми). Например, если бы вы были игроком 3 в вышеприведенном сценарии, ваш ввод будет:
3,11111222,11111444,11.22444,.1222.4.,333.3244,33333.44,333...44,333....4
Выход
Ваша программа должна вывести 4 целых числа. Первые два - это индекс строки и столбца соответственно слизи, которую вы хотите переместить, а следующие два - индекс строки и столбца, куда вы хотите их переместить.
На каждом ходу у вас есть три варианта: разложить, прыгнуть или слить.
распространение
Чтобы распространиться, координаты цели должны быть точно на один квадрат от перемещаемой слизи, а квадрат в координатах цели должен быть пустым. При распространении создается новая слизь по целевым координатам, а старая слизь не удаляется. После создания новой слизи все вражеские слизи на 8 клетках вокруг этой новой слизи конвертируются в игрока, который двигался.
Например, с доской на рис. 1, если игрок 1 должен был вывести
0 1 1 2
, результатом будет доска на рис. 2.1. 2. 11.22 11.12 1..22 1.112 ..22. ..11. ..... .....
Прыгать
Чтобы прыгать, координаты цели должны находиться ровно в двух квадратах от перемещаемой слизи, а квадрат в координатах цели должен быть пустым. При jupming новая слизь создается в координатах цели, а старая слизь удаляется. После создания новой слизи все вражеские слизи на 8 клетках вокруг этой новой слизи конвертируются в игрока, который двигался.
Например, с доской на рис. 1, если игрок 1 должен был вывести
0 1 2 3
, результатом будет доска на рис. 2.1. 2. 11..2 1...2 1...2 1...1 ....2 ...11 ...22 ...11
Объединить
Чтобы объединить, координаты цели должны быть точно на один квадрат от перемещаемой слизи, а квадрат в координатах цели должен быть той же слизью игрока. При слиянии старая слизь удаляется. Затем все пустые места в 8 квадратах вокруг целевой слизи преобразуются в игрока, который переместился (не включая перемещенную старую слизь).
Например, с доской на рис. 1, если игрок 1 должен был вывести
0 1 1 2
, результатом будет доска на рис. 2.1. 2. 11..2 1.112 1.1.2 11112 ....2 .1112 ..222 ..222
Вы также можете передать, просто выводя неверные координаты (например 0 0 0 0
).
Правила и ограничения
Дополнительные правила:
- Вы можете читать и записывать файлы в своей собственной папке, чтобы сохранить данные (материалы будут храниться в них
players/YourBotName/yourBotName.language
), но вы не можете изменять или получать доступ к чему-либо еще, кроме него. Доступ в интернет запрещен. - Ваше представление не может быть закодировано специально, чтобы помочь или навредить другому представлению. (У вас может быть несколько заявок, но они никоим образом не должны взаимодействовать друг с другом.)
- Ваша подача должна занимать не более 0,1 секунды за ход. Если ваше представление иногда занимает 0,105 секунды, это нормально, но оно может не всегда значительно дольше, чем этот срок. (Это в основном проверка работоспособности, чтобы избежать слишком длительного тестирования).
- Ваша заявка не должна быть точной копией (то есть использовать точно такую же логику) другой, даже если она на другом языке.
- Ваша заявка должна быть серьезной. Это основано на мнении, но если ваша заявка явно не пытается решить задачу (например, если вы проходите каждый ход), она будет дисквалифицирована.
Если ваша заявка нарушает какое-либо из этих правил или не соответствует спецификации, она будет дисквалифицирована, удалена playerlist.txt
и игра будет перезапущена с самого начала. Если ваша заявка будет дисквалифицирована, я оставлю комментарий к вашему сообщению с объяснением причин. В противном случае ваша заявка будет добавлена в таблицу лидеров. (Если вы не видите свое представление в списке лидеров, не имеете пояснительных комментариев к своему сообщению и опубликовали свое представление до того времени, как "Последнее обновление" ниже, сообщите мне! Возможно, я случайно пропустил это.)
В вашей заявке, пожалуйста, укажите:
- Имя.
- Командная оболочка для запуска программы (например,
java MyBot.java
,ruby MyBot.rb
,python3 MyBot.py
и т.д.).- Обратите внимание, что входные данные (ваш игрок и карта) будут добавлены в качестве аргумента командной строки.
- Программы будут тестироваться на Ubuntu 14.04, поэтому убедитесь, что ваш код может быть запущен (свободно) на нем.
- Номер версии, если ваш код работает по-разному на разных версиях вашего языка.
- Код вашего бота.
- Инструкция по компиляции кода, если это необходимо.
Контроллер кода / тестирование, пример бота
Код контроллера написан на C ++ и может быть найден на Github . Дополнительные инструкции по запуску и тестированию вашего кода можно найти там.
simplebot.rb
Очень простой бот, который распространяет или перепрыгивает случайную слизь в случайное место каждый ход, также размещен на Github .
Скоринг и таблица лидеров
Когда все квадраты на доске заполнены, игра заканчивается и подсчитываются очки. Окончательный результат игрока - это количество квадратов, содержащих их слизь в конце игры. Если прошло 2000 ходов (500 для каждого игрока), и игра все еще не закончена, игра все равно закончится, и результаты будут сообщаться, как если бы игра закончилась.
В конце турнира результаты всех игр будут усреднены, чтобы рассчитать окончательный счет каждого игрока, который будет размещен в таблице лидеров. Нет крайнего срока подачи заявок; Я буду продолжать обновлять таблицу лидеров по мере поступления новых заявок.
Требуется 4 представления, пока не появится реальная таблица лидеров.
+--------------------------+-----------+--------------------+
| Name | Avg Score | Last Updated (UTC) |
+--------------------------+-----------+--------------------+
| GreedySlime | 47.000 | Jul 22 10:27 PM |
| Jumper | 12.000 | Jul 22 10:27 PM |
| ShallowBlue | 5.000 | Jul 22 10:27 PM |
| Lichen | 0.000 | Jul 22 10:27 PM |
+--------------------------+-----------+--------------------+
Последнее обновление: 22 июля, 22:27 (UTC).
источник
Ответы:
GreedySlime
Просто делает ход, который дает наибольший чистый выигрыш единиц слизи.
Обратите внимание , что это написано в Python 2.x .
Выполнение примера (используя пример, приведенный в описании вызова, и предполагая, что код сохраняется в файле с именем
slime.py
):источник
Мелкий синий
Мелкий синий пытается выяснить, что может произойти в будущем, выполнив
n исчерпывающийпоиск дерева возможных ходов, к сожалению, он не продвигается дальше своего следующего хода. Затем он набрасывает несколько полусоценных очков на каждое возможное состояние доски после своего следующего хода, вычисляет счет для каждой отдельной ветви с одинаково смешной формулой и: вуаля, идеальный ход известен!РЕДАКТИРОВАТЬ: оригинальный код работал слишком медленно, поэтому я изменил его так, чтобы он брал только случайную выборку из всех возможных ходов. Он будет пробовать почти все ходы, когда мало возможных ходов, и меньший процент, когда возможно больше ходов.
источник
Джемпер
Любит прыгать, тем более к середине.
Пройдет, если слизи не могут прыгать.
C ++ , должен просто скомпилировать
g++ jumper.cpp -o jumper
Я украл ваш ход проверки извините. Также я разочаровался в правильной практике кодирования сразу после того, как начал, так что не смотрите. Тем не менее, кажется, что он работает на доске любого размера.
источник
DeathSlime :
Описание : Пытается охотиться на самого слабого врага и уничтожать его. Повторение.
Как запустить : ruby DeathSlime.rb
Ruby версия : 2.1.2
источник
лишай
Это бот, написанный на R. Он должен быть запущен с помощью
Rscript Lichen.R
.Предполагаемый алгоритм состоит в том, что он пытается покрыть прямоугольную область (заполняя пробел, используя
spread
). Когда прямоугольник закончен, онmerges
две слизи в одном из его углов (самый дальний от угла доски), чтобы расширить «обитаемую» область, затем заполнить этот вновь определенный прямоугольник и т. Д. Он не используетjump
.Если враг находится в пригодной для жизни зоне, и в этой области также есть пустое пространство, он заполняет пустое пространство рядом с ним. Если слизь, с которой нужно слиться при расширении жилой площади, окружена врагами, то
spread
вместо слияния будет только одна слизь .источник
0 0 0 0
когда на борту не осталось слизи.CornerSlime
Эта слизь имеет представление о углах, или, по крайней мере, когда я впервые написала это на C #, я больше не уверена.
Написанный на C ++, вероятно, будет хорошо компилироваться с gcc и почти без аргументов; надеюсь, я не использовал ничего особенного MSVC случайно.
Протестировано исключительно против себя на модифицированном сервере (нет нового модного компилятора C ++, где я нахожусь), поэтому я понятия не имею, как он будет работать, надеюсь, он не будет дисквалифицирован за слишком медленную работу. В настоящее время в этом боте нет случайности, но я могу добавить немного позже.
Это C #, портированный на C ++ (из-за проблем со скоростью) кем-то, кто действительно не знает C ++ и ужасен. Он начинается с создания массива ячеек, который затем заполняется всевозможной бесполезной информацией о клетках вокруг него (количество моих клеток, количество моих слизей и тому подобное). Затем он использует эту информацию, чтобы решить, нужно ли ему более внимательно изучать информацию, которую он использовал для создания этой информации, а затем потенциально использует упомянутую информацию для получения значимого результата.
источник