З поверненням! Я з радістю представляю третє завдання CodeBots. Цей вже давно в процесі створення. Це завдання буде розділено на 3 розділи: коротка версія, довга версія та додаткові деталі.
Коротка версія
Кожен учасник змагань напише програму на 24 команди. Ці боти будуть рухатися по всьому світу і копіювати свій код в інші боти, намагаючись не допустити інших ботів робити те саме. Однією з можливих команд є неоперація Flag. Якщо бот має більше ваших, Flagніж будь-який інший Flag, ви отримуєте бал. Ви виграєте, маючи найбільше очок.
Все вищесказане стосувалось двох останніх викликів. Цього разу боти зможуть одночасно запускати кілька рядків коду.
Довга версія
API
Кожен бот матиме рівно 24 рядки, де кожен рядок має такий формат:
$label command parameters //comments
Мітки та коментарі необов’язкові, і кожна команда має різну кількість параметрів. Все не залежно від регістру.
Параметри
Параметри набираються і можуть мати такі формати:
- Значення від 0 до 23.
- Змінна:
A,B,C,D - Значення з використанням додавання:
A+3або2+C - Рядок коду, який позначається за допомогою
#знака (#4представляв би 5-й рядок, тоді як#C+2представляв би рядок, обчислений заC+2). - Ви можете використовувати
$labelзамість позначення рядка коду. - Змінна або рядок коду опонента, позначений
*. Ваш опонент - бот на площі, перед якою ви стикаєтесь. (*BвідображаєBзначення опонента , тоді як*#9представляє 10-й рядок опонента). Якщо на цій площі немає нікого, команда не виконується.
Команди
Переміщення V
Переміщує бота North+(V*90 degrees clockwise). Рух не змінює напрямок.
Поворот V
Повертає бота V*90 degreesза годинниковою стрілкою.
Скопіюйте VW
Копії все , що в Vв W. Якщо Vномер рядка, то Wвін повинен бути номером рядка. Якщо Vє змінною або значенням, то вона Wповинна бути змінною.
Прапор
Нічого не робить.
Початок V
Починає новий потік, приєднаний до змінної V. Відразу, і на кожному майбутнім повороті, потік виконуватиме команду on line V.
Якщо Vвона вже приєднана до потоку, то ця команда є неоперативною. Якщо Vзмінна супротивника, то опонент запустить нитку, приєднану до цієї змінної.
Зупинка V
Зупиняє нитку, приєднану до змінної Vв кінці цього витка.
Блокування V
Запобігти лінію або змінний Vвід використання в будь-якому випадку , крім як по нитці , яка називається Lock. Наступний дзвінок Lockтим самим потоком розблоковується V. Блокування не можна викликати у змінних чи рядках супротивника.
Якщо Cond VW
Це випробування Cond. Якщо умова вірна, то вона перемістить вказівник потоку на номер рядка V, інакше на номер рядка W. Цей рядок буде негайно виконаний.
Conditionals може бути X=Y, X<Y, !Xабо ?X:
X=Yперевіряє, чи є два рядки одного типу і від одного бота, або ви перевіряєте, чи два значення однакові.X<Yперевіряє, чи є значенняXменшеY.!XперевіряєXзаблокованість змінної чи рядка (повертає значення true, якщо заблоковано)?Xперевіряє, чи є дана змінна приєднана до неї нитка
Додаткові відомості
Багатопотокові взаємодії
Дії одного типу виконуються одночасно. Дії виконуються в такому порядку:
Блокування. Якщо кілька потоків спробують заблокувати змінну, всі вони вийдуть з ладу. Якщо потік розблокує змінну, а інша намагається її заблокувати, змінна залишиться розблокованою.
Старт. Якщо кілька потоків намагаються запустити потік у змінній, вона вважатиметься одним запуском.
Скопіювати. Якщо обидва потоки копіюють в одну і ту ж змінну, змінна в результаті виявиться випадковою величиною. Якщо вони обидва копіюють в один рядок, жоден з них не працюватиме. Якщо потік копіює на ту саму змінну, з якої копіюється інший потік, то останній потік копіює випадкове значення. Якщо два потоки обидва копіюють з однієї змінної, вони будуть працювати нормально.
Якщо. Всі умови будуть перевірені одночасно, а потім змінні потоку будуть оновлені після. Виконання документа
Ifможе спричинити додавання дії з більш високим пріоритетом. Дії з більш високим пріоритетом виконуватимуться перед переміщенням минулогоIf, тоді як дії з нижчим пріоритетом виконуватимуться післяIf.Рухатися. Кілька ходів на одному боті перемістять бота суму всіх ходів. Якщо кілька ботів опиняться в одному місці, вони будуть повернуті на їх місце початку.
Поворот. Кілька оборотів на одному боті будуть підсумовувати.
Стій. Кілька команд зупинки на одній змінній рахуватимуться як одна зупинка.
Інші деталі
Ваш початковий потік починає прикріплюватися до Dзмінної
Повторення If(з Ifзаявою вказує на себе) не призведе до того, що ваш бот нічого не робить
Якщо нитка буде зупинена після блокування, ці блокування будуть розблоковані
Дії щодо використання заблокованої змінної чи рядка нічого не дадуть.
Якщо бот коротший, ніж 24 рядки, залишилися рядки заповнюються Flag
Виконання запису на змінній, яка також приєднана до початкової нитки, фактично призведе до того, що потік розпочне виконання нового значення, оскільки потік починає наступний поворот.
Боти розміщуються в тороїдальному світі за такою схемою:
B...B...B...
..B...B...B.
B...B...B...
Я додав кілька зразків ботів , які коментуються як мовні довідники.
Тут розташований контролер . Я довго працював над цим, але, напевно, все ще є помилки. Коли spec та контролер суперечать, spec є правильним.
Табло
1. 771 LockedScannerBot
2. 297 CopyAndSelfFlag
3. 289 DoubleTapBot
4. 197 ThreadCutterBot
5. 191 TripleThread
6. 180 ThickShelled
7. 155 Attacker
8. 99 RandomMover
9. 90 BananaBot
10. 56 LockedStationaryDoubleTap