У цьому виклику ви повинні створити види одноклітинних організмів для боротьби зі смертю на арені «Петрі». Арена представлена у вигляді прямокутної сітки, де кожна комірка займає один простір:
.....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 NDIVIDE NEAT NATTACK N 2- число представляє силу атаки (1 - 3)RESTEXPLODE
Черга вашої команди складається з того, щоб всі ваші клітини отримали можливість діяти по черзі. Усі ваші клітини діють до того, як діятиме будь-яка клітина противника. Як тільки всі ваші клітини діють, ваша черга закінчується, і починається черга вашого опонента. Як тільки всі клітини вашого опонента діють, ваша черга починається знову. У свою чергу, кожній клітці надається пріоритет, щоб діяти залежно від її віку: найстаріші клітини вашої команди діють першими перед молодшими.
Приклад
Ось як може поводитися програма. Введення від 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. Я зрозумію це в тексті виклику. Якщо у вас виникли проблеми, ми (і будь-хто інший із технічними питаннями) можемо продовжити цю дискусію в кімнаті чату, яку я щойно створив .