Что не так с общедоступными переменными?

33

Кодовые боты

Я ненавижу частные и защищенные переменные. Я просто хочу получить доступ ко всему и всему!

Если вы похожи на меня, то этот вызов для вас!

Написать бота, который работает вместе в гармонии с другими ботами, заставляет других ботов делать то, что вы хотите. Вы программист, и вы знаете, как все должно работать. Ваша задача - конвертировать как можно больше других ботов на ваши пути.

Код

У вас будет 24 строки кода для написания вашего бота. Каждый ход, каждый бот будет выполнять 1 строку последовательно.

Каждый бот хранит 5 переменных Aчерез E. Aи Bпредназначены для личного использования, Cсохраняет следующую строку для выполнения, Dсохраняет текущее направление и Eявляется случайным числом. Переменные начинаются с 0, за исключением случая D, который начинается со случайного значения. Все переменные хранят только 0-23. Числа, большие или меньшие, будут модулироваться на 24.

В этом посте я буду использовать оппонента как соседнего бота, с которым вы сталкиваетесь

Каждая строка должна содержать одну из следующих 5 команд:

  1. Flagничего не делает. Кроме того, как ты выиграл
  2. Moveперемещает вашего бота в Dнаправлении th Если бот уже занимает место, никакого движения не произойдет
  3. Copy Var1 Var2 копирует содержимое Var1 в Var2
  4. If Condition Line1 Line2 Если условие истинно, выполняется строка 1, иначе строка 2
  5. Block Var1 блокирует следующую запись в переменную

Переменная может использоваться следующим образом:

#Varбудет использовать переменную в качестве номера строки. Если значение Aравно 17, Copy #8 #Aсодержимое строки 8 будет скопировано в строку 17. *VarБудет использоваться переменная вашего оппонента. Copy 5 *Cустановит Cпеременную противника, чтобы 5 Var+Varдобавить две переменные. Copy D+1 Dповернет бота вправо

Когда Dиспользуется как направление, [North, East, South, West][D%4]будет использоваться

Эти модификаторы могут быть Copy *#*C #9объединены в цепочку: скопирует следующую строку, которую ваш оппонент выполнит в ваш собственный код в строке 9. **DОбратимся к Dпеременной оппонента .

Состояние будет оцениваться следующим образом:

  1. Если Var:
    1. Если Var это Aчерез C, он возвращает истину , если Var отличен от нуля, иначе ложь.
    2. Если Var есть D, он вернет true, если есть бот в Dнаправлении th, иначе false
    3. Если Var E, он вернет true, если E нечетно, иначе false
    4. Если Var это строка, она вернет true, если это строка Flag.
  2. Если Var1=Var2:
    1. Возвращает true, если оба значения A-Eравны и равны
    2. Возвращает true, если оба являются строками, а тип линии равен
  3. Если Var1==Var2:
    1. Возвращает true, если оба значения A-Eравны и равны
    2. Возвращает true, если оба являются строками и идентичны (флаги разных ботов не будут равны)

50 ботов каждого типа будут размещены в тороидальном мире по следующей схеме:

B...B...B...B...
..B...B...B...B.
B...B...B...B...
..B...B...B...B.

После каждой игры в 5000 ходов будут подсчитываться флаги на каждом боте. Вы получаете очко, если у бота больше вашего флага, чем у любого другого типа флага. Если в случае галстука между Nботами, очки не начисляются.

Будет 10 игр, и в конце будут накапливаться очки.

Примечания стороны

Комментарии в конце строки разрешены и обозначены //

Попытка сделать что-то, что не имеет смысла, например, добавление в строку, ничего не даст

Попытка сделать что-то на несуществующем боте ничего не даст

Бесконечная рекурсия по Ifзавещанию заканчивается без выполнения строки

If не меняет значение C

А Blockне истекает, пока кто-нибудь не попытается написать в него

Несколько переменных и строк могут быть заблокированы одновременно

BlockМногократное повторение переменной будет блокировать несколько раз, пока второй оператор блока находится в строке кода, отличной от вашей первой

Пробелы допускаются только между аргументами (и после команды)

Если бот короче, чем 24 строки, Flag будет остальные строки.

Пример программы

Copy 2 C        //Skip to the If line
Flag            //Where I'm storing my flag
Move            //Move in the D'th direction
If D #5 #2      //If there's a bot, copy code, otherwise, move!
Copy #1 *#E     //Copy my flag onto a random spot in my bot's code
Copy 2 C        //Skip back to the If line

Программа будет запускаться моим контроллером Python здесь .

Контроллер Java здесь. Он быстрый и выглядит намного лучше, чем Python.

Табло:

  1. 6837 $ Копия
  2. 3355 Локхид
  3. 1695 MindControl
  4. 967 византийский
  5. 959 AttackOrElse
  6. 743 Кадмиллион
  7. 367 Грипп
  8. 251 TheCommonCold
  9. 226 Волхв
  10. 137 HideBlockAttack
  11. 129 RowBot
  12. 123 FastMoveCloneDodge
  13. 112 FastForwardClone
  14. 96 QuickFreeze
  15. 71 Ремонт и защита
  16. 96 SuperFreeze
  17. 93 RovingVirus
  18. 80 ForwardClone
  19. 77 FreezeTag
  20. 68 Палимпсесте
  21. 62 BlockFreezeAttack
  22. 51 RushAttackDodge
  23. 46 Блокатор
  24. 40 TurretMaker
  25. 37 Copycat
  26. 37 Камикадзе
  27. 35 FlagInjector
  28. 33 RandomCopier
  29. 31 Коварный
  30. 29 HappyAsAClam
  31. 25 нановирус
  32. 21 Nullifier
  33. 19 нановирис
  34. 17 BoringCopybot
  35. 16 Movebot
  36. 14 Flagbot
  37. 13 нейтрализатор
  38. 12 Рак
  39. 9 DNAbot
  40. 9 Паразит
  41. 8 MetaInsidious
  42. 8 Ребрендинг
  43. 8 AdaptiveBot
  44. 8 Воспроизводящий Бот
  45. 8 KungFuBot
  46. 5 QuickFreezerbot
  47. 4 Атакующий
Натан Меррилл
источник
1
Я буду все об этом, как только Java будет доступна для тестирования.
Wasmoo
2
Я предполагаю, что вы никогда не играли в Core войну. en.wikipedia.org/wiki/Core_War
matt_black
Я не играл в нее, но я довольно много читал об этом во время написания этого задания.
Натан Меррилл
У меня есть патч для контроллера Python, и я попытался отправить его обратно на github ... но у меня нет прав доступа / я не знаю git. Патч заменяет все «16» на «num_lines», чтобы разрешить доступ на запись / переход к последним 8 инструкциям; также удаляет "max_flag_count = 0" из условия связывания в методе Declare_flags (), который иногда присваивает двустороннюю связь с третьим ботом.
Адипи
1
Есть ли ETA, когда будет запущен следующий боевой раунд? Нет спешки на всех. Мне просто любопытно. Спасибо.
COTO

Ответы:

13

Flagbot

Flag

Зачем делать что-либо, когда другие боты будут достаточно хороши, чтобы дать мне свой код?

Sparr
источник
8

Freeze Tag

Move
If D #3 #2
Copy 23 C
Copy 3 C
Copy #23 *#*C
Copy #21 *#*C+1
Copy #22 *#*C+2
Copy #21 *#*C+3
Copy #22 *#*C+4
Copy #21 *#*C+5
Copy #22 *#*C+6
Copy #21 *#*C+7
Copy #22 *#*C+8
Copy #21 *#*C+9
Copy #22 *#*C+10
Copy #21 *#*C+11
Copy #22 *#*C+12
Copy #21 *#*C+13
Copy #22 *#*C+14
Copy D+1 D
Copy 0 C
Flag
Flag
Copy C+23 C

Ловите противника в петле, наполняйте его флагами, переходите к следующему противнику.

Sparr
источник
Copy C+23 CЭто должна быть самая злая строка кода xD.
Cruncher
Мне это интересно. Это может быть невероятно. Вместо того, чтобы заполнять их флагами, вы можете поместить в них цикл, который заполняет себя флагами? Или это не считается вашими флагами?
Cruncher
Это аккуратная и жизнеспособная идея, но более сложная. Вы должны написать бота, который использует его :)
Sparr
2
Вы знаете ответ на последний вопрос? Or would that not count as your flags?, Потому что, если они не считаются вашими собственными флагами, это определенно не хорошее решение
Cruncher
@Cruncher вы можете дать им один из ваших флагов и заставить их скопировать его, который будет считаться одним из ваших.
Спарр
8

паразит

Зачем убивать других ботов? Этот бот просматривает код противника и заменяет только флаги.

Copy 1 A
Copy E D
Block #A
If *#A #C+3 #C
Copy A+A+A+A+A A
Copy C+19 C
Copy #C+4 *#A
Flag
Copy 1 A
Copy E D
Block #A
If *#A #C+3 #C
Copy A+A+A+A+A A
Copy C+19 C
Copy #C+4 *#A
Flag
Copy 1 A
Copy E D
Block #A
If *#A #C+3 #C
Copy A+A+A+A+A A
Copy C+19 C
Copy #C+4 *#A
Flag
PhiNotPi
источник
8

$ Копировать

Этот бот использует те же приемы, что и Lockheed от COTO, поэтому я буду бесстыдно брать и улучшать.

Это использует Cуязвимость, чтобы сломать блоки и даже полностью изменить нейтрализатор. Это также написано в абсолютах из-за этого. Я думаю, что это может сломаться, еслиC сдвиг будет восстановлен, но пока сдвиг постоянен, его можно переписать для борьбы с ним.

По какой-то причине отсутствие петли в конце сделало этого бота супер хорошим.

Block #C+A 
If D #7 #13        //If [enemy] Copy 0 ELSE block
If D #8 #0         //If [enemy] Freeze 0 ELSE block
If D #9 #6         //If [enemy] FreezeCheck ELSE Inc
Move
Copy 0 C
Copy A+5 A          //Inc
Copy 23 *C          //Copy 0
Copy #10 *#*C+23    //FreezeAttack
If *#*C==#10 #11 #5 //FreezeCheck: If [frozen] GOTO Copy Attack ELSE GOTO [1]
Copy C+23 C         //FREEZE
Copy 13 C           //GOTO Copy Attack
Copy 15 C           //Loop Copy Attack
Block #C+A
Copy D+3 *D             //Copy Attack: Spin Enemy
Copy 0 *B               //Set enemy counter (a la COTO)
Copy #*B+0 *#*C+*B+1    //Copy my lines
Copy #*B+1 *#*C+*B+2    //Copy my lines
Copy #*B+2 *#*C+*B+3    //Copy my lines
Copy *B+3 *B            //Inc counter
If *B==0 #19 #12        //Loop check
Copy D+1 D              //Turn myself
Wasmoo
источник
1
Я преклонюсь перед вашим улучшенным дизайном и снова окажусь перед вами на соревновании Bots v. 3. ;)
COTO
Я искренне верю, что это было групповое усилие со стороны каждого. Этого бы не существовало, если бы не несколько ботов для моделирования. Интересно, что добавление этого бота полностью реорганизовало табло, так как боты, которые зависели от блокировки, были сломаны, в то время как другие, которые зависели от замены флага, поднялись.
Wasmoo
Может ли кто-нибудь резюмировать где-то реальное поведение Блока и как этот бот и Локхид используют это в своих интересах?
Спарр
Каждая строка может накапливать блоки, как описано HappyAsAClam . Самое главное, он не складывается для блоков, вызываемых с одинаковыми Cзначениями. Таким образом, блок может быть сложен при вызове из Ifоператора, который используется здесь. $ Copy разбивает блоки (например, моллюск), выполняя Copyодну и ту же строку снова и снова до успешного завершения, что дает ему преимущество перед Lockheed.
Wasmoo
7

Lockheed

Мое третье (и, вероятно, последнее) подчинение этой конкретной войне ботов: Реактор Локхид, или сокращенно "Локхид".

Block #C+A
If D #C+7 #C+1
Block #C+A
Move
Copy A+5 A
If A==0 #C+12 #C+21
Copy C+17 C
Copy D+3 *D
Copy C+9 C
Copy C+21 C
Copy C+23 C
Copy #C+23 *#*C+2
Copy #C+22 *#*C+1
Copy 0 *A
Copy #*A+C+9 *#*C+*A+1
Copy *A+1 *A
If *A==0 #C+15 #C+17
Copy D+1 D
Copy C+5 C

Особая благодарность выражается @Wasmoo, который поделился своим открытием: «Многократная блокировка переменной будет блокироваться многократно, если второй оператор block находится в строке кода, отличной от вашей первой». просто неправда "подвиг. Я широко использую его.

Также спасибо Натану Мэриллу за организацию соревнований и публикацию симулятора. Симулятор совершенно бесценен при настройке ботов. Я бы не поверил, если бы не смоделировал это своими глазами, но добавление или удаление самой концептуально незначительной функции бота может означать разницу между большим успехом и полным провалом. Я разрываюсь относительно того, хорошо это или нет.

COTO
источник
Многократная блокировка переменной не удалась. Тем не менее, он блокируется только в том случае, если: вы выполняете ту же строку ( Ifуказание на эту строку не будет неудачным), вы блокируете одно и то же значение (одна строка может блокировать строки 1-24 с возрастающей переменной), и блок еще не был освобожден (кто-то пытался изменить эту переменную)
Nathan Merrill
Я оспариваю оператор в OP, потому что инструкция блока связана с IP, а не оператором блока. Таким образом, один оператор блока может создать до 24 отдельных блоков для всех команд. Я утверждаю, что предложение в ОП, в котором говорится «пока второй оператор блока находится в строке кода, отличной от вашей первой», следует изменить на «до тех пор, пока блок для пары ( C, <block target>) еще не действует». То есть строка, в которой находится оператор блока, не имеет отношения к укладке, за исключением того, что если блок выполняется непосредственно, C= адрес инструкции блока.
COTO
1
Этот бот потрясающий! Он объединяет в себе все лучшие концепции. Он защищает себя до тех пор, пока не находит врага, затем дважды замораживает врага и загружает свою копию на цель, прежде чем освободить ее в противоположном направлении. В процессе моделирования я видел, как одна из его копий восстанавливает поврежденный оригинал. ВОТ ЭТО ДА! Отличная работа, COTO!
Wasmoo
6

Атака Или Остальное

Видя, что защитные роботы, такие как византийцы, преуспевают, я решил создать защитного робота.

Это имеет два набора шаблонов, в зависимости от того, присутствует враг или нет.

  • Если противника нет, он блокирует свои линии на 3 хода и затем движется.
  • Если враг присутствует, он чередуется между копированием своего флага и копированием кода, что заставит врага скопировать этот флаг (слабый репликатор) он копирует свой флаг
  • В конце цикла он меняется на случайное направление и продолжает
  • Большинство аспектов его кода дублируется

Дальнейшее тестирование показало несколько важных концепций:

  • «Поворот случайно» показал себя значительно лучше, чем «Поворот направо» (+2700 за альтернативу)
  • Приращение блока A+7Показанный будет более эффективным, чем любой другой прирост (+200 к следующему лучшему)
  • Показано, что «прямая атака» лучше, чем «слабый репликатор» (+900 к альтернативе)
  • Защита «3-1-2-1» лучше других комбинаций (+200 к следующей лучшей)
  • Дублированный код атаки, блока и петли улучшает его счет (+300 за недублированный)
  • Прирост дублированного блока не улучшает его счет (+400 к дублированию)

Графическое наблюдение за симуляцией через пользовательский интерфейс Java очень помогло. Спасибо! Ниже приведен новый и улучшенный код. Я не думаю, что могу сделать что-нибудь еще.

Block #C+A          //Dynamic block for If statements
If D #20 #0
If D #19 #8
If D #20 #23
If D #19 #0
If D #20 #8
If D #19 #23
Copy A+7 A          //Increment dynamic block
Block #C+A          //Dynamic block for If statements
If D #19 #8
If D #20 #0
If D #19 #8
If D #20 #23
If D #19 #8
If D #20 #0
If D #19 #23
Copy E D            //Turn Random
Copy 23 C           //Loop to beginning
Copy 23 C           //Loop to beginning
Copy #22 *#*C+1     //Copy my flag to the enemy's next
Copy #21 *#*C+1     //Copy my flag to the enemy's next
Flag
Flag
Move
Wasmoo
источник
Этот бот сделал действительно круто. И добро пожаловать в GUI.
Натан Меррилл
Я обновил его, добавив второй цикл, который значительно улучшил его производительность. Я также заметил, что блокировка в Java основана на том, Cчто заблокировало его. Поскольку у этого бота есть вращающийся блок на основе C, он будет накапливать несколько блоков в каждой из своих команд. Это делает этого бота более оборонительным.
Wasmoo
Насколько я понимаю, может быть установлен только один блок для каждой исходной инструкции, следовательно, ваш код выше может установить только один блок для любой инструкции (и для создания одного блока в каждой инструкции потребуется полные 24 * 17 поворотов). Если мое понимание неверно, то язык «Многократная блокировка переменной будет блокировать многократно, пока второй оператор блока находится в строке кода, отличной от вашей первой». в OP необходимо внести поправки, потому что это утверждение (откровенно) ложно, если код Wasmoo может устанавливать несколько блоков для любой инструкции.
COTO
@COTO: симулятор Java добавляет один блок на Ifстроку в список, вводя Cпеременную, которая его вызвала. Таким образом, с 1 блоком и 9 If, которые выполняют оператор Block, бот может получить до 10 блоков для каждой строки (по крайней мере, за 24 * 10 * 10 ходов). Возможно, OP неправильно передал симуляцию.
Wasmoo
Я снова обновил код, чтобы отразить дальнейшее улучшение итераций при сохранении основной концепции. Я подумал, что это будет лучше, чем заполнять форум с каждой итерацией, например, переходить от слабой репликации к прямой атаке и от недублированной к дублированной. Если вы хотите, чтобы я опубликовал свой оригинал, я могу это сделать.
Wasmoo
5

Роу Бот

Move
If D #7 #0
If D #7 #0
If D #7 #0
If D #7 #0
If D #7 #0
Copy 0 C
If D=*D #9 #8     //If they point in a different direction
Copy *D D           //fix that
If #A==*#A #10 #11  //Did we copy line A already?
Copy A+1 A          //If so, A++
Copy #A *#A         //else, copy it!

Будет двигаться, пока не найдет робота.
Установите этого робота в том же направлении, что и он сам.
Затем скопируйте свой код в робота.
Это должен составить ряд роботов "Row Bot". :)

MegaTom
источник
Есть две (легко решаемые) проблемы. Во-первых, Ifзаявления должны быть написаны заглавными буквами. Во-вторых, не должно быть пробелов с обеих сторон =, как D=*D.
PhiNotPi
Это потрясающая идея.
Спарр
Без флага ты не выиграешь.
Пауло Эберманн
3
@ PaŭloEbermann боты заполнены флагами до 24 строк, так что этот бот имеет 12 неявных флагов в конце.
Спарр
5

Супер заморозка

Move                    // start moving!
Block #E
If D #12 #0             // 8 turns of attack or move
If D #12 #0
If D #12 #0
If D #12 #0
If D #12 #0
If D #12 #0
If D #12 #0
If D #12 #0
Copy D+1 D              // change direction
Copy 0 C                // start over
If *#*C==#23 #13 #14    // if opponent is frozen, give them a flag, otherwise freeze them
Copy #C+13 *#E          // give a flag to opponent
Copy #23 *#*C           // copy freeze line to opponent
Flag                    // 8 flags, one per If above
Flag
Flag
Flag
Flag
Flag
Flag
Flag                    
Copy C+23 C             // this line freezes any bot that executes it

Этот бот пытается заморозить бота перед ним, пока он не сработает, затем записывает несколько флагов в случайные строки, а после 8 ходов вращается и переходит к другому противнику.

Sparr
источник
5

византийский

Бот с высокой степенью защиты, который устанавливает несколько блоков по своим флагам и наиболее чувствительным инструкциям, включая метаблоки (то есть блоки по инструкциям критических блоков).

Он также постоянно движется непредсказуемым образом и устанавливает флаги в многочисленных местах противников с максимальной отдачей.

Block #A
Block #A+1
Block #A+2
Copy E D
Move
Block #A+3
Block #A+4
Move
Copy #22 *#*C+1
Copy E D
Move
Block #A+5
Block #A+6
Block #A+7
Move
Copy #22 *#23
Block #A+8
Block #A+9
Block #A+10
Copy #22 *#2
Copy A+14 A
Move
Flag
Copy #22 *#*C+12

Не уверен, как это будет работать, так как я не могу имитировать. Но мы дадим ему шанс. ;)


отказ

Я написал это до того, как PhiNotPi любезно сообщил, что условная логика бесплатна. Тем не менее, я решил оставить это, так как никогда не может быть слишком много ботов.

COTO
источник
этот бот выигрывает!
полугодие
4

Cadmyllion

«Я только что вошел в бот в королевской битве», - говорю я. «Он движется каждые несколько ходов, чтобы предотвратить атаки медленных ботов».

"Что вы подразумеваете под более медленными ботами?" PhiNotPi спрашивает.

«Застрявшие боты оценивают длинные цепочки условной логики», - отвечаю я.

«Операторы« If », которые перенаправляют на другие операторы, включая другие операторы« if », выполняются в один и тот же ход», - говорит PhiNotPi.

"Сладкие убитые правила сборки кода!" Я плачу. "Кто придумал эту идею?"

... и, таким образом, история о том, как появился Кадмиллион.

Cadmyllion: бот, который успешно использует сюрреалистическую способность оценивать бесконечное количество условных выражений в одной инструкции ... делая практически все, что делает, условно.

Код

If D #15 #19
Move
If D #16 #20
Copy D+3 D
Block #A
If D #15 #20
Copy A+1 A
If D #16 #1
Move
If D #15 #19
If D #16 #4
Copy E D
Block #A+12
Copy C+10 C
Flag
If *#0==#14 #17 #21
If *#0==#14 #18 #21
If *#*C+1==#14 #18 #22
Copy *C+11 *C
Block #A+6
Block #A+18
Copy #14 *#0
Copy #23 *#*C+1
Flag
COTO
источник
4

Мета Коварный

Этот бот зависает, а затем конвертирует противников в менее эффективные версии Sparr Insidious , которые, в свою очередь, превратят противников в ботов, которые раздают мне спам-флаги. Вероятно, это самый сложный бот, который я написал, и поэтому я ожидаю, что он будет работать ужасно, не было места для блокировки и только один флаг в коде. Превращение бота в коварного клона также занимает слишком много времени.

Самой большой проблемой было написание кода для коварных клонов таким образом, чтобы он работал независимо от своего положения в боте. Замораживание удаляется, когда я вставляю второй-последний код точно в том месте, где находится замораживание, это как раз вовремя запускает противника.

If D #2 #1
Copy 23 C
Copy #8 *#*C // freeze the opponent
Copy 9 A
Copy #A *#A+*C // copy the next line at the appropriate  line
Copy A+1 A
If A==0 #7 #23
Copy 23 C
Copy C+23 C
If D #C+2 #C+23 // the code for the Insidious clone starts here
Copy C+21 C
Copy C+2 C
If D #C+6 #C+22
If D #C+5 #C+22
If D #C+4 #C+20
If D #C+3 #C+19
If D #C+2 #C+18
Copy E D
Copy #C+7 *#*C
Flag
Copy C+3 A
Copy #C+22 #A
Copy A+1 A
Copy C+21 C // And ends here
overactor
источник
Это умная идея. Однако я не вижу никаких команд перемещения. Значит ли это, что ни ваш бот, ни спам-бот не будут двигаться?
Wasmoo
Клоны Insidious могут перемещаться в зависимости от того, что находится в оригинальном коде ботов, из-за ограниченного пространства пришлось выбросить немало функциональных возможностей, чтобы сделать это возможным даже с 24 строками. Это было больше умственное упражнение, чем все остальное на самом деле.
overactor
3

Ремонт и защита

Этот бот восстанавливает свой собственный код, защищая недавно отремонтированные линии.

If #A==#A+16 #C+1 #C
Copy #A #A+8
Block #A+8
Copy A+1 A
Copy E D
Move
Copy #C+1 *#*C
Flag
If #A==#A+16 #C+1 #C
Copy #A #A+8
Block #A+8
Copy A+1 A
Copy E D
Move
Copy #C+1 *#*C
Flag
If #A==#A+16 #C+1 #C
Copy #A #A+8
Block #A+8
Copy A+1 A
Copy E D
Move
Copy #C+1 *#*C
Flag

Объяснение:

Начальное значение Ais 0, а строки пронумерованы 0-23. Если Ifоператор выполнен и имеет значение false, он снова пытается выполнить ту же строку. Контроллер не позволяет боту выполнить одну и ту же строку дважды, поэтому ход заканчивается и Cувеличивается до 1.

Следующая строка Copy #A #A+8фактически выполняется независимо от значения Ifоператора. Разница в том, что он выполняется дважды, если верно, и один раз, если ложно. Если строка #A+8заблокирована (что в конечном итоге происходит), то выполнение ее дважды с фактическим копированием при ее выполнении только один раз разблокирует ее. Затем вновь скопированная строка блокируется, чтобы сохранить ее.

PhiNotPi
источник
Я пытаюсь понять всех вас, ребята, боты, но я застрял. Какова начальная стоимость A? Не так ли 0? Если так, то ваша первая строка сравнивает строку 0 со строкой 16, но, как я понял из примера с ботом OP, первая строка - строка 1, не так ли? Кроме того, все еще в первой строке, #Cотносится к этой самой строке, значит ли это, что если Ifвыражение возвращает false, вы застряли в бесконечном цикле?
plannapus
@plannapus Я добавил некоторые объяснения.
PhiNotPi
3

нейтрализатор

Этот бот заставляет свою жертву переписывать всю свою программу, делая ее равной 0 очков. Как только вирус на месте, он движется дальше. Это выжженная земля к победе.

If D #C+2 #C+3          // A: If [enemy exists] B else C
Copy C+22 C             // GOTO A
If *#*C==#7 #C+4 #C+5   // B: If [enemy was neutralized] D else E
Move                    // C: Move
Copy E D                // D: Turn Randomly
Copy #7 *#*C            // E: Neutralize enemy
Copy C+1 C              // Skip the next line
Copy #C #C+1            // Neutralizing Code [Copy this line to next line]

Сравнение *#*C==#7, похоже, не корректирует смещение противника правильно, но бот в итоге движется дальше.

Wasmoo
источник
Copy C+1 Cэто все, что нужно, чтобы пропустить одну строку.
Натан Меррилл
2
«Пропустить следующую строку» означает, что ваш бот потратит 16 ходов, выполняя инструкции флага, прежде чем продолжить. Возможно, вы захотите Copy 23 Cтуда вместо этого вернуться к первой строке.
Спарр
«Пропустить следующую строку» произойдет, только если «GOTO A» было перезаписано. Есть и другие способы сделать этого бота более оскорбительным и оборонительным, например, повторить «A», продублировать код и заблокировать «GOTO A». Тем не менее, если этот бот ударил вообще, он все равно практически мертв.
Wasmoo
3

коварный

Move
If D #4 #0
If D #4 #0
Copy 0 C
Copy 4 C
If D #12 #11
If D #12 #11
If D #12 #11
If D #12 #11
If D #12 #11
Copy D+1 D
If D #4 #3
Copy #C+8 *#*C
Flag
Copy C A
Copy #C+22 #A
Copy A+23 A
Copy C+21 C

Вдохновленный @Cruncher, этот бот заражает других ботов небольшим блоком кода, заполняя другого бота флагами этого бота. Эти боты тогда сидят уток для дальнейшей атаки, но они будут в основном заполнены моими флагами, когда они будут повторно заражены кем-то еще.

Изменить: спасибо @PhiNotPi за помощь в гольф, @overactor за советы по эффективности

Sparr
источник
Поздравляю с ударом 2к!
bjb568
3

Счастлив как моллюск

Это упражнение в блокировке. Он работал замечательно хорошо, пока не $Copyпришел.

Моллюск имеет 22 блочные команды. Поскольку Aсмещается каждый цикл, они будут ссылаться на разные строки каждый раз через цикл. Это позволяет каждой команде складывать блоки на каждой другой строке, максимально до 22 блоков на строку. Таким образом, чтобы сломать полностью бронированный моллюск, нужно было бы написать в строку 22 раза.

Например, #10 каждый раз через цикл будут защищены следующие строки:

  • Петля 0, A = 0 #10 защищен линией 7 ( 7+0+3= 10)
  • Петля 1, A = 7 #10 защищена линией 0 (0+7+3 = 10)
  • Петля 2, A = 14 #10защищена линией 17 (17+14+3 = 34 = 10)
  • Петля 3, A = 21, #10защищенная линией 10 ( 10+21+3= 34 = 10)

Таким образом, после строки 10 цикла 3 #10блокировалось 4 раза, требуя 4 записи #10для разрыва блоков, а 5-й - для перезаписи строки.

Обратите внимание, что блоки имеют ключевое Cзначение по их значению и не будут складываться, если защищенная строка уже была заблокирована тем же Cзначением. Таким образом, после установки 22 блоков для каждой строки блоки больше не будут складываться.

Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Block #C+A+3
Copy A+7 A
Flag
Wasmoo
источник
3

MindControl

Я думаю, никогда не поздно?

Block #C+D
If D #2 #0        // Scan for enemy
If *#E==#E #0 #5  // Attack if necessary
Copy D+5 D        // Turn
Copy 22+1 C       // Repeat
Copy 4+1 C        // ATTACK:
Copy #22+1 *#*C   //   Freeze
Copy #17 *#17     //   Upload the DOWNLOADER
Copy #18 *#18     //
Copy #21 *#19     //
Copy D+2 *D       //   FACE ME!!
Copy 17 *C        //   Start download
If E #0 #13
If E #0 #13
Copy 22+1 C
Flag
Flag
Copy *#B+20 #B+20         // DOWNLOADER
If *#B+20==#B+20 *#20 #19 //
Copy 22+1 C               //
Copy 1+B B                //
Copy 16 C                 //
Flag
Copy 23+C C        // FREEZE

MindControl исходит из моей идеи, что на копирование всей моей программы противнику потребуется значительное время, в течение которого мой бот уязвим для атак с других направлений. Так почему бы не заставить оппонента скопировать мою программу, пока я сканирую врагов?

Как только он находит врага, MindControl немедленно замораживает врага, чтобы предотвратить побег. Затем он загружает загрузчик противнику и позволяет жертве загрузить саму программу MindControl. Загрузчик использует тот факт, что несколько ботов использует Bи будет зацикливаться, пока не загрузит все 24 строки. Когда загрузчик перезаписывает #19с Copy 16 Cна Copy 23 C, это означает, что жертва загрузила все строки и продолжит саму перезагрузку.

Первые версии моего бота не включают в себя блоки. И это было настолько уязвимо, что почти любое изменение наносит ущерб. Поэтому я решил добавить блоки на основе $ Copy от Wasmoo (на основе Lockheed от COTO). Недостатком, который я обнаружил, является то, что оригиналу трудно исправить ошибки в копиях. Но это далеко не увечье, и счет значительно увеличился, поэтому я сохранил блоки.

ОБНОВЛЕНИЕ

Я улучшил загрузчик, чтобы продолжать попытки загрузки до успешного переписывания, чтобы обойти блоки. Это означает, что для загрузки загрузчика требуется еще один ход, но после этого изменения мой счет удвоился! Не могу поспорить с числами.


Еще одно обновление. Как вы могли заметить, MindControl решает, атаковать ли цель, сравнивая случайную линию между собой и ее целью. Если они совпадают, MindControl просто предполагает, что цель уже заражена, и оставляет ее в покое. (Примечание: раньше я использовал статическую линию для сравнения, но это дает много ложных срабатываний и негативов) Оказывается, это дает много ложных срабатываний. Поэтому я решил использовать ==и сделать некоторые незначительные изменения , как C+23в 23+C. Программа функционально идентична, но отличается в глазах ==. Теперь, когда в MindControl нет строки, идентичной любой строке в любом другом боте, он на 100% поразит любого нетронутого бота. Опять же, оценка значительно увеличилась.


Снова улучшен загрузчик. Теперь он работает по более короткой петле. (что, кажется, имеет большую корреляцию с моим счетом)


Улучшенный загрузчик еще раз. Использует оригинальный код бота, чтобы он загружался быстрее. Также добавлены 2 случайных блока, которые, кажется, улучшают счет

TwiNight
источник
Никогда не поздно!
Натан Меррилл
Я рассматриваю возможность переименования в BrainWash ...
TwiNight,
Или BunkerBuster после просмотра перебора загрузчика через HappyAsAClam в бункере
TwiNight,
Я думал о том, чтобы попробовать эту идею сначала загрузить загрузчик, но я не мог получить его таким маленьким, как вы. Отличная работа! Я также люблю ваше использование D в качестве дельты блуждающего блока; это сохраняет команду и ускоряет ваш дизайн. Я поражен, что бот без команды «Move» будет работать так хорошо. Симуляторы показывают, что боты имеют тенденцию слипаться, но я не знал, что это будет выигрышная стратегия. И я согласен, есть что-то однозначно удовлетворяющее в разрушении моллюсков.
Wasmoo
@ Wasmoo Очевидно, что дизайн загрузчика требует, чтобы бот оставался неподвижным, и это заставляет ботов слипаться. Мне нравится думать об этом как о корнях дерева, которые протягивают руку и ассимилируют других ботов, чтобы расти. Но я думаю, ловкость - вот почему $ Copy и Lockheed побеждают меня.
TwiNight
2

нападающий

Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Copy #E *#*C
Flag
Натан Меррилл
источник
2

Movebot

Move
Copy 23 C
Flag

Как и Flagbot, но передвигайтесь, принимая подарки кода, чтобы идти со всеми нашими флагами.

Sparr
источник
2

Воспроизводящий бот

Этот бот пытается заморозить своего противника, а затем скопировать весь код в этот бот, прежде чем перезапустить другой бот. Это также должно работать (в основном), если противник использует блокировку, хотя это делает все это еще медленнее, чем уже есть.

If D #23 #22
Copy 23 C
Copy #18 *#*C
Copy #18 *#*C+1
Copy #18 *#*C
Copy #18 *#0
Copy #18 *#0
Copy 0 *C
Copy 0 *C
Copy 1 A
Copy #A *#*A
If D #12 #14
Copy A+1 A
Copy 9 C
Copy 23 C
Flag
Flag
Flag
Copy C+23 C
Copy D+1 D
Flag
If *#*C==#*C #19 #13
Move
If *#*C+1==#*C+1 #21 #13
overactor
источник
Нет пробелов в состоянии
Натан Меррилл
@NathanMerrill gotcha
переигрыватель
2

волхв

Волхв - это простая попытка самораспространяющегося вируса. Он пытается скопировать себя в программы других ботов. (Отредактировано, чтобы удалить отрицательные числа, исправить условие, обрезать линии.)

Block #A
Copy #A *#A
Copy A+1 A
If A #0 #4
Copy 0 *C
Flag
Move
Copy 0 C
Исаак
источник
Отрицательные значения не допускаются. Пожалуйста, используйте 23 для B
Натан Меррилл
Пожалуйста, используйте 23, а не 25.
Натан Меррилл
Если только я не неправильно понял, это может привести к тому, что он не будет блокировать или копировать строки 23 или 24 (примечание: он немного изменился по сравнению с первой ревизией, A увеличивается на 1, а не B)
Исаак
+0 = 24 +1 = 25, -1 = 23. Если вы хотите, чтобы это было -1, это должно быть 23.
Натан Меррилл
Так было раньше, потому что я думал, что вы можете сравнить только с 0 (как-то пропустил часть '=', я обвиняю скимминг), но теперь он изменился, так что A начинается с 1 и заканчивается на 25. Просто представьте строку 3 как for (int i = 1; i < 25; i++).. .
Isaac
1

DNAbot

Flag
Copy 8 D
Copy 16 B
If #D==#B #C+2 #C+3
Block #A
Copy #D #A
If D #7 #15
Copy #23 *#*C
Copy A+1 A
Copy B+1 B
Copy D+1 D
If #D==#B #C+2 #C+3
Block #A
Copy #D #A
If D #7 #15
Move
Copy A+1 A
Copy B+1 B
Copy D+1 D
If #D==#B #C+2 #C+3
Block #A
Copy #D #A
If D #7 #15
Flag

Этот бот восстанавливает свой собственный код во время движения и атаки.

Sparr
источник
1

блокатор

Copy A+1 A
Block #A
Copy C+22 C
Натан Меррилл
источник
1

обезьяна

If D #4 #3
Move
Copy 23 C
Copy *#*C #1
Copy #23 *#E
Натан Меррилл
источник
1

Быстрый морозильник

Пытается скопировать флаги в строке, которые будут выполнены рядом с его противником, перемещается, если нет врага для атаки.

Block #13
Block #14
If D #13 #14
If D #13 #14
If D #13 #14
If D #13 #14   
If D #13 #14
If D #13 #14
If D #13 #14
If D #13 #14
If D #13 #14
If D #13 #14   
Copy 23 C
If E #15 #16
Move
Copy #23 *#*C
Copy D+1 D
overactor
источник
Первые две строки недействительны. Им нужны № 13 и № 14
Натан Меррилл
1

Блокировать, заморозить, атаковать

Block #A        // start block loop
Copy A+1 A      // loop A from 0 to 23
If A #3 #4      
Copy 23 C       // repeat block loop
Copy 5 C        // exit block loop to attack/move loop
Move
If D #11 #5     // attack or move
Copy A+1 A      // loop A from 0 to 23
If A #9 #10
Copy 5 C        // repeat attack/move loop
Copy 23 C       // exit attack/move loop to block loop
Copy 11 C       // start of attack routine
Copy #23 *#*C   // freeze opponent
Copy #19 *#E    // copy flag to opponent
Copy #20 *#E    // copy flag to opponent
Copy #21 *#E    // copy flag to opponent
Copy #22 *#E    // copy flag to opponent
Copy D+1 D      // change direction
Copy 5 C        // repeat attack/move loop
Flag
Flag
Flag
Flag
Copy C+23 C     // freeze instruction, for copying

Блокирует все 24 строки, затем зацикливается 24 раза, двигаясь или атакуя, затем повторяется. Атака включает в себя попытку заморозить противника, затем скопировать четыре флага в случайные места, затем повернуть.

Sparr
источник
1

Скрыть, заблокировать, атаковать

Этот бот основан на Block Freeze Attack. Я изменил расположение некоторых Ifоператоров, чтобы сделать их более компактными, что позволило мне установить больше флагов. Я также убегал в начале игры, чтобы выиграть время для блокировки.

Copy D+1 D
Move           //buy some time by moving to a more secure location
Block #A+2
Copy A+1 A
If A #11 #17
Copy #23 *#E
Copy #22 *#E
Copy #21 *#E
Copy #20 *#E
Copy #19 *#E
Copy D+1 D
Copy 1 C
Move
If D #14 #15
Copy 3 C
Copy 11 C
Copy #18 *#*C
If D #16 #15
Copy C+23 C
Flag
Flag
Flag
Flag
Flag
PhiNotPi
источник
1

Ровинг Вирус

If D #6 #16
Move
Copy 23 C
Flag
Flag
Flag
Copy 6 C
Copy A+23 A
Copy #A *#A                     //clone previous line to enemy
Copy 23 *C                      //freeze enemy
If A #6 #16                     //loop or turn then continue
Copy 0 *C                       //reboot enemy
Copy 23 C                       //start moving again
Flag
Flag
Flag
Copy D+1 D                      //turn
Flag
Flag
Flag
Flag
Flag
Flag
Copy 22 C                       //freeze instruction

Этот бот бродит, пока не находит врага, затем замораживает их, заменяет весь их код своим собственным, размораживает их, затем снова бродит.

Sparr
источник
1

Простуда

Это заразит вас практически сразу, и вы будете распространять его вокруг. основываясь на паразите PhiNotPi , простуда почти сразу же проверяет, может ли он скопировать свой флаг на ваш. Блокирует случайное значение, если не может. Немного двигается, если нет противника.

Block #22
If D #8 #5
If D #8 #5
If D #8 #5
Copy 23 C
If E #6 #7
Copy D+1 D
Move
If *#E=#22 #15 #9
If *#E+1=#22 #16 #10
If *#E+2=#22 #17 #11
If *#E+3=#22 #18 #12
If *#E+4=#22 #19 #13
If *#E+5=#22 #20 #14
If *#E+6=#22 #21 #23
Copy #22 *#E
Copy #22 *#E+1
Copy #22 *#E+2
Copy #22 *#E+3
Copy #22 *#E+4
Copy #22 *#E+5
Copy #22 *#E+6
Flag
Block #E
overactor
источник
1

грипп

Это тесно связано с простудой (которая была основана на моем паразите) с немного увеличенной скоростью.

Move
Block #23
If D #8 #0
If D #8 #0
If D #8 #0
If D #8 #7
Copy 0 C
Copy D+1 D
If *#E #9 #10
Copy #23 *#E
If *#E+1 #11 #12
Copy #23 *#E+1
If *#E+2 #13 #14
Copy #23 *#E+2
If *#E+3 #15 #16
Copy #23 *#E+3
If *#E+4 #17 #18
Copy #23 *#E+4
If *#E+5 #19 #20
Copy #23 *#E+5
If *#E+6 #21 #22
Copy #23 *#E+6
Block #E
Flag
PhiNotPi
источник
Я с нетерпением жду возможности увидеть разницу. № 5 в строке 5 вызовет бесконечный цикл, и эти № 7 также вряд ли будут тем, что вы хотели.
переиздание
@overactor Спасибо, это были ошибки, созданные добавлением дополнительной строки.
PhiNotPi
Знаю ли я когда-нибудь боль.
переиздание
1

Ребрендинг

Move
If D #10 #0
If D #10 #0
If D #10 #0
If D #10 #0
If D #10 #0
If D #10 #0
If D #10 #0
If D #10 #0
Copy 0 C
If *#E=#14 #11 #9
If *#E==#14 #13 #12
Copy D+1 D
Copy #14 *#E
Flag

Этот бот пытается случайным образом найти флаги у вражеских ботов и заменить их дружественными флагами, отворачиваясь после обнаружения успеха. Вдохновлен раком бота.

Sparr
источник