Голодные игры - Ешь или умри
Если ты не ешь, ты умрешь. Если ты ешь, ты живешь (пока не умрешь). Вы будете умирать, так что постарайтесь , чтобы умереть в прошлом.
обзор
Есть остров, населенный стадом хищных животных. Вы контролируете стаю из пяти хищников. Ваша цель состоит в том, чтобы сохранить ваш пакет в живых. Делайте это, поедая добычу. Добыча, как правило, убегает от хищников и в противном случае старается держаться стаями. Конечно, ваша стая будет на том же поле, что и любая другая , поэтому участники соревнований попытаются съесть их раньше, чем вы сможете. Не позволяйте этому обескураживать вас, иначе вы будете голодать.
Как играть
Создайте и отправьте программу командной строки, чтобы направить ваш пакет. Он будет получать информацию о состоянии от управляющей программы на STDIN и выводить команды на STDOUT. Формат подробно описан ниже. Каждая программа будет выполняться только один раз и должна продолжаться до тех пор, пока в ней не останется живых участников пакета. Вам нужно будет прочитать ввод, как он поступает, и быстро ответить. Для каждого ответа существует строгое время ожидания 200 мс. Если к тому времени вы не ответили, ваш пакет не получит новых инструкций для текущего хода.
Если ваша программа не может быть запущена контроллером, она не будет считаться действительной. Пожалуйста, включите строку командной строки, которую мне нужно будет использовать для запуска вашего представления. Если есть какие-либо специальные инструкции (для настройки компиляторов и т. Д.), Пожалуйста, включите их. Если я не могу заставить его работать, я буду просить вас о помощи в комментариях. Если вы не ответите, я не смогу принять вашу заявку.
Турнир будет проходить на 64-битной системе Linux. Имейте это в виду при указании любых необходимых указаний.
подробности
Положение и направление каждого существа имеют форму пары чисел с плавающей запятой двойной точности (например
double
), представляющих ихx
иy
координаты соответственно.Каждое существо считается точкой. Это означает, что они могут перекрываться и занимать одно и то же пространство. Вы не будете отталкиваться, и нет понятия столкновения с другими существами.
Остров представляет собой квадрат, 500 единиц в сторону. Если вы попытаетесь выйти за эти рамки, вы будете зажаты на краю. Начало координат
{0,0}
вверху слева, сx
увеличением вправо иy
увеличением вниз. Опять же карта не переносится .Игра начинается с 1500+ (packCount * 50) хищных животных. Они будут собраны в центре острова, но быстро решат начать движение.
Пакеты будут расположены равномерно по периметру. Заказ на упаковку перемешивается, поэтому не рассчитывайте на запуск в определенном месте.
Хищные животные могут видеть всех других животных в радиусе 30 единиц. Они могут двигаться максимум 6.0 единиц за ход.
Хищники могут видеть всех других животных в радиусе 50 единиц. Они могут двигаться со скоростью не более 6,1 единиц за ход. Это означает, что они могут видеть добычу до того, как ее увидят, и (едва) опередить ее.
Хищники живут и умирают в зависимости от уровня голода . Он начинается с 1000 и уменьшается на единицу каждый ход. Если после движения хищник находится в пределах 1 единицы добычи, он автоматически съест его. Это удаляет добычу и устанавливает голод хищника на 1000. Каждый хищник может съесть только одну добычу за ход. Если в пределах диапазона более одного, он будет съедать тот, к которому цикл попадет первым (не обязательно ближайший). Хищник умирает, если его голод достигает нуля.
Пакеты начинаются с пяти участников каждый. Каждые 5000 ходов, все пакеты в игре будут порождать одного нового участника. Он будет размещен в пределах видимого диапазона другого участника стаи. Убедитесь, что ваши записи могут обрабатывать более пяти членов.
Каждые 1000 ходов появляется больше жертв. Число новых жертв будет числом живых хищников минус один.
Хищники не могут атаковать других хищников. Они едят добычу, когда ловят ее. Вот и все.
Порядок за ход:
- Все жертвы принимают решения
- Все хищники принимают решения
- Все добыча движется
- Все хищники двигаются / едят
Порядок, в котором каждая колода принимает свои решения / поступает, будет рандомизирован на каждом ходу.
Протокол (Общий)
Все коммуникации осуществляются в строковом формате US-ASCII
. Числа преобразуются в строки с использованием Java Double.toString()
или Integer.toString()
. Ваш вывод должен быть отформатирован так, чтобы его могли прочитать Java Double.valueOf(String)
(вы не будете выводить целые числа). Подробнее о разбираемых форматах см. В документации поDouble
. Все поля в строке разделены стандартным \t
символом, а переводы строки \n
. Вся строка будет завершена нулевым байтом \0
.
В примерах ниже я использую, <>
чтобы пометить поля для удобства чтения. Их нет в реальных строках.
Протокол (вход)
Длина входной строки зависит от количества видимых существ в вашем пакете. Он может превышать 100 тыс. Символов, так что будьте к этому готовы. Базовая настройка:
Строка 0: основная информация об игре.
turn
номер текущего хода, а количество - это общее количество добычи и хищников, оставшихся на поле. Этоinteger
в виде строки.<turn>\t<preyCount>\t<predatorCount>\n
Строка 1: уникальные идентификаторы членов вашей группы и уровни голода. Они не даны в одинаковом порядке для каждого входа. Используйте уникальные идентификаторы для отслеживания отдельных членов, а не порядок, в котором они появляются на входе. Опять же, это
integer
как строки. Для пакета из двух это будет:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
Строка 2: Позиции участников вашей стаи, в том же порядке, который указан в строке 1 . Это
double
как строка:<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
Следующие строки отображают видимость каждого члена пакета в том же порядке, который указан в строке 1 . Они будут представлены в виде двух строк на члена.
Первый для каждого состоит из мест для добычи, которую он может видеть. Второе - места для хищников, которых он может видеть. Эти места не являются уникальными в целом. Например, если два члена стаи могут видеть одно и то же животное, оно будет в строке обоих членов. Кроме того, ваши собственные участники пакета будут включены. Если вы хотите исключить их, вы можете сравнить местоположения с собственными участниками. Все местоположения в double
формате строки.
Для каждого живущего члена:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
Наконец, последний символ будет \0
в начале следующей строки.
Исключение: если вы получили ввод dead\0
, ваш пакет мертв. Пожалуйста, закончите свою программу изящно. Контроллер должен закрывать все живые процессы в закрытом состоянии, но я бы не хотел, чтобы процессы зомби были повсюду. В качестве любезности вы можете указать время ожидания ввода. Например, мой пример класса заканчивается, если он не получает ввод в течение 15 секунд.
Протокол (Выход)
Вывод прост. Вы дадите пару double
значений для каждого члена пакета live. Они представляют движение, которое вы хотели бы, чтобы они взяли на этом ходу. Например, если ваше существо находится в данный момент {100.0, 100.0}
и вы даете им команду {-1.0, 1.0}
, они перейдут в {99.0, 101.0}
. Все числа будут в одной строке, разделенной табуляцией.
Например, если у вас было 3 активных участника пакета, это был бы правильный ответ:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
Это будет двигаться ваши существа путем {1.0,-1.0}
, {2.0,-2.0}
и {3.0,-3.0}
. Порядок такой же, как и полученный на входе. Не забудь конец \0
!
Если вы введете неверные данные, последуют плохие результаты. Если какое-либо одно число не может быть проанализировано для a double
, оно станет нулевым. Если строка в целом не может быть проанализирована, никаких новых инструкций не будет, и весь ваш пакет будет использовать указания из предыдущего хода.
Все направления будут зафиксированы на максимальном расстоянии 6,1 единиц. Вы можете двигаться медленнее, чем это, если хотите. Например, {1, 0}
переместит вас на одну единицу. {6,8}
(расстояние 10) только переместит вас на 6,1 единиц и уменьшит до примерно {3.66, 4.88}
. Направление остается постоянным.
Важно: управляющая программа считывает ваш STDOUT и STDERR. Если вы сгенерируете исключение и напечатаете в STDERR, очень маловероятно, что сообщение будет иметь форму правильного ответа. Старайтесь избегать этого.
Программа управления / Тестирование
Источник для контроллера можно найти здесь на bitbucket.org . Вам нужно будет скомпилировать его перед запуском. Основной класс есть Game
, и все классы находятся в пакете по умолчанию. Для запуска включите команду каждого пакета в качестве отдельного аргумента. Например, если вы хотите запустить Java ChaserPack и Python LazyPack.py, вы можете использовать:
java Game "java ChaserPack" "python LazyPack.py"
На карте добыча отображается зеленым цветом, а хищники - красным. Однако, какой бы пакет не был первым, указанный в качестве аргумента, он будет окрашен в синий цвет. Это сделано для того, чтобы их было легче различить в целях тестирования. Хищники также будут мигать белым в течение пяти кадров, когда они едят.
Игра будет продолжаться до тех пор, пока последний хищник не умрет от голода, и пишет в консоль, когда происходят события голодания или вымирания. Как только игра будет завершена, оценка будет выставляться за каждую колоду. Если вы не хотите видеть события голодания / вымирания, вы можете использовать -silent
аргумент. Тогда он будет только выводить окончательный счет. Вы должны передать это в качестве первого аргумента :
java Game -silent "java ChaserCat" "./someOtherPack"
Включен скелет Java-пакета с именем GenericPack
. Он включает в себя основные необходимые операции ввода / вывода. Это там, чтобы дать четкий пример того, как разобрать и ответить. Если вы хотите добавить шаблон на другом языке, дайте мне знать.
Также включен хищник, основанный на шаблоне ChaserPack
. Он не будет включен в турнир и включен только в целях тестирования. Он работает довольно плохо из-за преднамеренного недостатка прицеливания. Если вы не можете победить, продолжайте пытаться.
Ниже приведен пример запуска управляющей программы (нажмите для просмотра видео). Качество видео не очень хорошее (извините), но вы можете почувствовать, как движется добыча. ( осторожно: аудио )
счет
Победитель будет определяться турниром, набирая очки в каждом раунде.
Каждый раунд продолжается, пока все хищники не мертвы. Каждый пакет будет оценен в зависимости от того, когда его последний член умер от голода. Затем им будут назначены баллы в зависимости от порядка. Очки будут накапливаться в течение десяти раундов, и победителем становится колода с наибольшим количеством очков.
Первое место за каждый раунд получит 100 очков. За каждое место после этого вознаграждение будет уменьшено на 20% (округлено в меньшую сторону). Это будет продолжаться до тех пор, пока очки не достигнут нуля (после 17-го места). Места 18+ не получат очков за раунд. Пакеты, которые связывают, получат равные очки. Например:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
Максимально возможное количество очков в течение турнира составляет 1000, с первого места все десять раз.
Если несколько программ завершат турнир, привязанный к первому месту, будет проведен еще один турнир из десяти раундов, в котором будут представлены только заявки на первое место . Это будет продолжаться, пока не появится один победитель.
Я постараюсь проводить турнир примерно еженедельно или по мере поступления новых заявок.
Дополнительные правила (играй честно!)
Вы не можете читать или писать на любые внешние ресурсы. Поскольку вы не собираетесь вызывать вашу программу несколько раз, любая информация о состоянии может храниться внутри.
Не вмешивайтесь в другие процессы / представления. Это не означает, что не пытайтесь украсть их добычу, убежать от них и т. Д. Это означает, что не мешайте выполнению процесса. Это на мое усмотрение.
Конкурсанты ограничены максимум тремя заявками. Если вы отправите больше, я наберу только первые три отправленных. Если вы хотите отозвать один, удалите его.
Записи могут не существовать исключительно для поддержки других записей. Каждый должен играть, чтобы выиграть на свой счет.
Ваша программа может порождать максимум один дочерний процесс за раз ( всего потомков, а не прямых). В любом случае, убедитесь, что вы не превысили время ожидания. Вы не можете вызывать сам
Game
класс каким-либо образом.
Результаты - 29 апреля 2014
Вот результаты последнего турнира из десяти раундов:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
Пакеты, представленные до 09:00 EDT 2014/04/29, включены в этот прогон.
Вы также можете просмотреть детали для каждого раунда . По какой-то причине я решил пронумеровать раунды в обратном порядке, поэтому он начинается с «раунда 10».
Обновления
2014/04/23: FGreg сообщил об ошибке, связанной с тайм- аутами (спасибо!). Исправление было реализовано, поэтому тестировщики захотят обновить код своей управляющей программы.