У цьому виклику ви повинні створити види одноклітинних організмів для боротьби зі смертю на арені «Петрі». Арена представлена у вигляді прямокутної сітки, де кожна комірка займає один простір:
.....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
. (Інші атрибути також можуть бути нульовими, але це функціонально втрачає гру!)
Ви починаєте з однієї клітини, у північно-західному чи південно-східному куті, на відстані одного простору від будь-якого краю. Початкова клітина має повний HP і енергію.
Кожна клітина діє
Щоразу, ваша програма буде викликана один раз для кожної осередку, що живе у вашій команді (за винятком клітинок, щойно створили цю чергу), щоб клітина могла діяти. Вашій програмі надаються дані про 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. Я зрозумію це в тексті виклику. Якщо у вас виникли проблеми, ми (і будь-хто інший із технічними питаннями) можемо продовжити цю дискусію в кімнаті чату, яку я щойно створив .