В этом испытании вы должны создать вид одноклеточных организмов, чтобы сражаться до смерти на арене чашки Петри. Арена представлена в виде прямоугольной сетки, где каждая клетка занимает одно пространство:
.....x....
...x...o..
...x.c..o.
.......o..
Атрибуты
Каждая клетка имеет три атрибута. При указании вида клеток в начале игры вы выделяете 12 баллов среди этих атрибутов.
- Очки здоровья (HP): если HP клетки падает до нуля, она умирает. Новые клетки имеют полный HP.
- Когда клетка умирает, она оставляет труп, который другие клетки могут съесть для получения энергии.
- Ячейка не может восстановить потерянное HP, но она может создать новую ячейку с полным HP путем деления.
- Энергия : большинство действий, которые клетка может предпринять, требуют энергии. Активно отдыхая, клетка может восстановить потерянную энергию до максимума своего вида.
- Вид клетки с энергией менее 5, скорее всего, потерпит неудачу, потому что он не может делиться, чтобы создать новые клетки.
- Клетка не может восстановить энергию сверх максимальной ценности своего вида.
- Вновь созданная ячейка имеет начальное значение энергии, скопированное из ее родителя (и максимальное значение, определяемое спецификацией вида).
- Кислотность : если ячейка взорвалась, уровень кислотности ячейки используется при расчете ущерба соседним ячейкам.
действия
Каждый ход, каждая клетка может выполнять одно действие:
Перемещение: клетка перемещается на одну клетку в любом направлении (N / S / E / W / NE / NW / SE / SW) за 1 энергию.
- Клетка не может перейти в пространство, занимаемое другой живой клеткой.
- Ячейка не может сдвинуться с сетки.
- Переход на клеточный труп уничтожает труп.
Атака: клетка атакует соседнюю клетку, нанося от 1 до 3 урона, затрачивая от 1 до 3 единиц энергии.
- Ячейка может атаковать в любом направлении (N / S / E / W / NE / NW / SE / SW).
- Законно нападать на дружественные ячейки.
Разделить: ячейка делится и создает новую ячейку в соседнем пространстве, затратив 5 энергии.
- Ячейка может делиться в любом направлении (N / S / E / W / NE / NW / SE / SW).
- Новая ячейка имеет полный HP согласно вашей оригинальной спецификации ячейки.
- Новая ячейка имеет столько же энергии, сколько ее родительская ячейка после вычитания стоимости деления. (Например, родительская ячейка с начальными 8 энергетическими точками будет уменьшена до 3 энергии и произведет дочернюю ячейку с 3 энергиями).
- Новая клетка не может действовать до вашего следующего хода.
- Клетка не может делиться на пространство, занимаемое живой клеткой, но она может делиться на пространство, занимаемое трупом мертвой клетки (это уничтожает труп).
Ешьте: клетка съедает труп соседней клетки, получая 4 энергии.
- Клетка может питаться в любом направлении (N / S / E / W / NE / NW / SE / SW).
Отдых: клетка ничего не делает за один ход, восстанавливая 2 энергии.
Взрыв: Когда ячейка имеет 3 или меньше HP и больше энергии, чем HP, она может взорваться, нанося урон всем восьми соседним клеткам.
- Повреждение каждой соседней клетки
(exploding cell HP) + (explodng cell acidity)
- Взорванная клетка умирает и оставляет труп, как и любые клетки, погибшие при взрыве.
- Повреждение каждой соседней клетки
протокол
Настроить
Ваша программа будет работать со строкой, указанной BEGIN
в stdin. Ваша программа должна записать в стандартный вывод , разделенных пробелами список 3 неотрицательных целых чисел, представляющих HP, энергию и кислотность для вашего вида клеток: например, 5 6 1
. Числа должны быть до 12. Кислотность может быть 0
, если хотите. (Другие атрибуты также могут быть нулевыми, но при этом функционально проигрывает игру!)
Вы начинаете с одной клетки, в северо-западном или юго-восточном углу, в одном месте от любого края. Начальная клетка имеет полное здоровье и энергию.
Каждая клетка действует
Каждый ход ваша программа будет вызываться один раз для каждой ячейки в вашей команде (кроме ячеек, только что созданных в этот ход), чтобы эта ячейка могла действовать. Ваша программа снабжена данными о stdin, которые включают состояние чашки Петри и информацию об этой конкретной ячейке:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
Первые два числа указывают ширину и высоту арены: здесь есть арена 10 на 4.
- Эти
o
клетки являются вашими; чтоx
клетки ваши враги. (Это всегда так; каждый игрок всегда видит свои клетки какo
.) - В
.
пространствах пусто. - В
c
пространствах представляют собой съедобные трупы клеток.
Числа после пустой строки представляют информацию об этой ячейке:
- Первые два числа являются
x,y
координатами, проиндексированными0,0
в верхнем левом углу (так что6 3
здесь относится к самой южнойo
ячейке). - Третье число - HP клетки; четвертое число - энергия клетки.
Ваша программа должна вывести (на стандартный вывод) действие. В приведенных ниже примерах мы будем использовать N
в качестве примера направление, но это может быть любое направление, допустимое для этого действия ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ SW
). Вся программа выводится без учета регистра, но в примерах будет использоваться верхний регистр. Любое выходное действие, которое является недопустимым (либо потому, что оно имеет недопустимый синтаксис, либо пытается выполнить недопустимое действие), игнорируется и приводит к ячейке REST
(и, таким образом, получает 2 энергии).
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- число представляет силу атаки (1 - 3)REST
EXPLODE
Ход вашей команды состоит из того, что всем вашим клеткам предоставляется возможность действовать один за другим. Все ваши клетки действуют до того, как действуют какие-либо клетки противника. Как только все ваши клетки сработают, ваш ход заканчивается, и начинается ход вашего оппонента. Как только все клетки вашего оппонента начнут действовать, ваш ход начинается снова. В течение вашего хода каждой ячейке предоставляется приоритет в зависимости от ее возраста: самые старые ячейки в вашей команде действуют в первую очередь перед более молодыми.
пример
Вот как может вести себя программа. Ввод от stdin обозначается здесь ведущими >
стрелками (отделенными от фактического ввода поясняющим пробелом), а вывод на stdout имеет <
стрелки.
> BEGIN
< 5 6 1
Затем программа вызывается снова:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
После хода вашего оппонента (который решил DIVIDE W
с одной стартовой ячейкой) ваша программа вызывается дважды, один раз для каждой ячейки:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
Для второго вызова на вашем ходу:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
Обратите внимание, что эта вторая ячейка видит обновленное состояние доски на основе движения другой ячейки ранее в ваш ход. Также обратите внимание, что эта ячейка была создана с 1 энергией, потому что родительская ячейка имела 6 энергий, когда она выполняла деление в последний ход (таким образом, первоначальные 6, за вычетом затрат на 5 энергий деления, создали дочернюю ячейку с 1 энергией).
Теперь ваш ход окончен и начинается ход вашего противника. Две противоположные ячейки получат возможность действовать, и тогда начнется ваш следующий ход.
победа
Вы можете выиграть одним из следующих способов:
- Уничтожение всех противостоящих клеток, или
- Наличие большего количества клеток, чем у вашего противника после того, как каждый игрок завершил 150 ходов
Подсчет очков будет зависеть от количества побед в 100 играх друг против друга. В половине симуляций ваша программа будет запущена первой.
Связные игры (то есть одинаковое количество клеток после 150 ходов или единственные оставшиеся клетки погибают вместе в результате взрыва) не учитываются при подсчете побед ни одного из игроков.
Дополнительная информация
- Ваша программа не должна пытаться поддерживать состояние (помимо использования состояния чашки Петри): одноклеточные организмы не имеют очень хорошей памяти и реагируют на мир мгновенно за мгновением. В частности, запись в файл (или другое хранилище данных), связь с удаленным сервером или установка переменных среды явно запрещены.
- Материалы будут запускаться / компилироваться в Ubuntu 12.04.4.
- Специфика 100 выигрышных игр еще не подтверждена, но они, вероятно, будут включать несколько размеров арены (например, 50 трасс на маленькой арене и 50 трасс на большей арене). Для более крупной арены я могу увеличить максимальное число ходов, чтобы обеспечить правильное сражение.
Ресурсы
Вот код драйвера, который запускает симуляцию, написанную для Node.js и вызываемую node petri.js 'first program' 'second program'
. Например, сопоставление написанной на Python ячейки с написанной на Java ячейкой может выглядеть следующим образом node petri.js 'python some_cell.py' 'java SomeCellClass'
.
Кроме того, я понимаю, что чтение и синтаксический анализ нескольких строк в stdin может быть огромной болью, поэтому я подготовил несколько полных примерных ячеек на разных языках, на которых вы можете свободно строить, полностью пересматривать или полностью игнорировать.
- Клетка Java
- Ячейка питона
- Ячейка JavaScript (для использования с Node.js)
Конечно, вы можете написать ячейку на другом языке; Это просто три языка, для которых я решил написать стандартный код для экономии времени.
Если у вас есть какие-либо проблемы с запуском драйвера, не стесняйтесь пинговать меня в чате, который я создал для этой задачи . Если у вас недостаточно репутации для чата, просто оставьте комментарий.
источник
'node c:/cell/cell_template.js'
для каждого аргумента, точно так же, как вам нужно указать'java CellTemplate'
для кода Java. Я сделаю это более ясным в тексте задачи. Если у вас все еще возникли проблемы, мы (и все остальные, у кого есть технические проблемы) можем продолжить это обсуждение в чате, который я только что создал .Ответы:
Вот мой относительно простой бот, который я запрограммировал на Ruby. По сути, он отдает приоритет делению первым и пытается делиться на врагов, чтобы получить контроль над полем. Второй приоритет - еда, третий - атака. Это легко превзойти образец ячейки Python.
источник
$
.$
используется для обозначения глобальной переменной. Да, они злые, но в этой маленькой программе это не имеет большого значения.амеба
Сначала делится на четыре, а затем пытается добраться до середины, чтобы ограничить пространство репликации противников. Затем начинается тиражирование. При перемещении или копировании находит оптимальный путь к ближайшему врагу и движется или делится к нему, пытаясь отрезать врагу доступное пространство.
Если враг находится рядом или на расстоянии одного поля, он всегда будет атаковать или двигаться к нему, позволяя ряду позади ничего не делать, чтобы заполнить пустые места.
Я не проверял это ни на каких других материалах, поэтому понятия не имею, насколько хорошо это будет сделано.
источник
Простая клетка сделана в
node.js
. Протестировал это снова на примере узловой ячейки и против Костронора он победил их.Обновить
Все еще довольно просто, попробуйте двигаться навстречу врагу или разделить.
источник
эволюция
Это представление эволюционировало и уже не является простым одноклеточным организмом! Он пытается атаковать / взрываться всякий раз, когда это возможно, в противном случае он разделяется или движется к врагу. Перемещение должно решить проблему клетки, окруженной дружественными клетками с максимальной энергией, неспособной сделать что-то полезное.
После перемещения всегда остается 3 энергии, чтобы нанести максимальный удар по врагу.
источник
берсерк
Поскольку я использовал Clojure, у которого есть некоторые ограничения, в основном из-за огромного времени запуска, я немного развлекался. Когда программа дается,
BEGIN
она выводит4 6 2 LOOP
, указывая, что она не останавливается. Затем он принимает входные данные как непрерывный поток и заканчивается наEND
. Он не сохраняет состояния, что становится понятным, если не использовать глобальные переменные или повторно использовать возвращаемые значения. Поскольку реализация этого зацикленного действия еще не завершена, я не смог полностью протестировать код (надеюсь, код достаточно ясен).Клетка получила свое имя благодаря своему характеру взрыва, когда это возможно (и, таким образом, имеет кислотность), а также благодаря тому, что сразу после деления расставила приоритеты.
Я загрузил сгенерированный jar-файл в свой Dropbox . Бежать с
java -jar petridish-clojure.jar
Просто для ясности:
Обновление журнала
источник
Голодный, голодный бот
Вот запись в R. Надеюсь, я правильно понял, каковы технические характеристики взаимодействия с вашей программой. Должны быть вызваны с
Rscript Hungryhungrybot.R
.Если у него есть по крайней мере 6 единиц энергии, он делится, преимущественно в направлении противника. В противном случае он ест то, что рядом с ним, или то, что доступно. Если нет доступной еды, то она либо взорвется, когда вокруг будет больше врагов, чем сестринских клеток, либо сразится с ближайшими врагами. Отдыхает только в том случае, если энергия равна 0, и нечего есть.
источник
Error: unexpected 'else' in "else"
ваш код. Боюсь, я вообще не знаю R, поэтому не могу начать исправлять эту ошибку. Для справки, я получаю эту ошибку как при запуске в драйвере, так и при простом запуске программы и вводе вручнуюBEGIN
.Error in if (dir[1] < 0) where <- paste(where, "N", sep = "") : missing value where TRUE/FALSE needed
Error: object 'food' not found
(когда ониСкоординированные бактерии
Надеюсь, я еще не опоздал.
В моих тестах побеждайте других противников (и всегда убивая их всех), и битва никогда не закончится, если она окажется лицом к лицу, свидетельство того, что стратегия сильна.
Когда вы одноклеточные, вы можете запомнить предыдущее состояние, но вы можете использовать свою собственную позицию, чтобы вести себя по-другому! знак равно
Это разделит бактерии на делитель и движитель, и при этом будет больше полезных бактерий, а не только линия фронта, сохраняя при этом линию защиты.
Он также координирует свои атаки, чтобы сосредоточиться на конкретном враге, чтобы враги убивались быстрее (это направлено на мою другую отдельную клетку, которая фокусируется на HP).
В середине игры, которая определяется количеством ячеек на доске, они будут пытаться прорваться на вражескую территорию, обойдя их флангами. Это ключевая стратегия выигрыша.
Это самый высокий темп роста по сравнению со всеми другими противниками в настоящее время, но он имеет медленный старт, поэтому он лучше работает на большой арене.
Запустить его с
java CoordinatedBacteria
источник
Я думаю, что я отправлю свое представление, так как вы так щедры, чтобы добавить шаблонную логику ...
В вашей логике была проблема, когда действие "Еда" вызывало бы АТАКУ вместо ЕД и тратило бы труп.
Я изменил вашу суть так же, чтобы иметь рабочее решение, которое должно работать относительно хорошо. Он начинается с 4 л.с. и 8 энергии, поэтому после разделения и отдыха обе клетки могут снова разделиться. Он будет стараться размножаться, атаковать врагов, есть трупы и отдыхать, в этом порядке. Таким образом, внутренние ячейки сохранят свои 8 энергетических точек, чтобы быстро заменить убитые внешние клетки и оставить им 3 энергетических точки, чтобы совершить 3-точечную атаку или размножиться после одного хода покоя. 4 л.с. должны выдержать хотя бы одну полную силу атаки.
Кислота, кажется, пустая трата очков для меня, поэтому я держал ее вне ...
Я не проверял представление, поскольку это было 2-х минутной вещью;)
вот мой код:
источник
Тонкодисперсный бомбардировщик
Поскольку вы любезно предоставили шаблонный код, я решил создать собственную простую ячейку; Эта ячейка имеет 4 кислотности, всего 1 л.с. и 7 единиц энергии. Он пытается выйти из диапазона дружеских отношений, а затем ждет там (или ест, если это возможно), пока не получит возможность взорвать или повторить. Атакует только если это единственный вариант.
Это довольно грубая стратегия, которая, вероятно, будет работать плохо, но мне любопытно посмотреть, как она работает. Я проверю это и улучшу это позже сегодня, возможно.
источник
node c:/cells/petri.js 'node c:/cells/bomber.js' 'node c:/cells/sample.js
. Когда я набираю это в консоли приложения узла, я просто получаю три точки, когда я пытаюсь запустить его в Windows cmd, я получаю: «узел» не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл. Я сохранил все файлы как файлы .js в правильной папке. Любая помощь для нуб? Я бы пошел в чат или прокомментировал бы где-нибудь еще, но моя репутация слишком низкая.if((nearbyEnemies.length - nearbyFriendlies.length > 1 ¦¦
-¦¦
он не является допустимым оператором, и у вас несоответствующие скобки. Я думаю, может быть, форматирование кода испортилось, когда вы его опубликовали?=
), когда вам нужно сравнение на равенство (==
).