Добро пожаловать! Я рад представить 3-й вызов CodeBots. Этот был в разработке долгое время. Эта задача будет разделена на 3 раздела: короткая версия, длинная версия и дополнительные подробности.
Короткая версия
Каждый участник напишет программу из 24 команд. Эти боты будут перемещаться по миру и копировать свой код в других ботов, пытаясь помешать другим ботам делать то же самое. Одной из возможных команд является no-op 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
должна быть переменная.
Флаг
Ничего не делает.
Star TV
Запускает новый поток, присоединенный к переменной V
. Сразу же и при каждом следующем повороте поток выполнит команду в режиме онлайн V
.
Если V
он уже подключен к потоку, то эта команда не используется. Если V
переменная противника, то противник запустит поток, присоединенный к этой переменной.
Стоп V
Останавливает поток, присоединенный к переменной V
в конце этого хода.
Блокировка V
Предотвратить линию или переменный V
от использования в любом случае , кроме как по нити , которая называется Lock
. Последующий вызов Lock
того же потока разблокирует V
. Блокировки не могут быть вызваны на переменных или строках противника.
Если Конд 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...
Я добавил несколько примеров ботов , которые комментируются как справочник по языку.
Контроллер находится здесь . Я долго работал над этим, но, вероятно, все еще есть ошибки. Когда спецификация и контроллер противоречат, спецификация верна.
Табло
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