Що не так із загальнодоступними змінними?


33

Коди-боти

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

Якщо ви схожі на мене, то цей виклик для вас!

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

Кодекс

У вас буде 24 рядки коду, щоб написати бота. Кожен виток, кожен бот буде виконувати 1 рядок послідовно.

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

У цій посаді я буду використовувати опонента, щоб бути сусіднім ботом, з яким ви стикаєтесь

Кожен рядок повинен містити одну з наступних 5 команд:

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

Змінна може бути використана наступним чином:

#Varвикористовуватиме змінну як номер рядка Якщо A17, 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напрямку є бот , інакше false
    3. Якщо Var є E, він повернеться істинним, якщо E непарним, інакше хибним
    4. Якщо Var - це рядок, вона поверне true, якщо це лінія Flag
  2. Якщо Var1=Var2:
    1. Повертає істину, якщо обидва є A-E, і дорівнює однаковій кількості
    2. Повертає істину, якщо обидва є рядками, а тип рядка рівним
  3. Якщо Var1==Var2:
    1. Повертає істину, якщо обидва є A-E, і дорівнює однаковій кількості
    2. Повертає істину, якщо обидва є рядками та однаковими (прапори різних ботів не будуть рівними)

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 рядки, прапор буде рештою рядків.

Зразок програми

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 знаходиться тут Це швидко і виглядає набагато краще , ніж пітона один.

Табло:

  1. 6837 $ Копіювати
  2. 3355 Локхід
  3. 1695 MindControl
  4. 967 Візантійський
  5. 959 AttackOrElse
  6. 743 Cadmyllion
  7. 367 Грип
  8. 251 TheCommonCold
  9. 226 Маг
  10. 137 HideBlockAttack
  11. 129 RowBot
  12. 123 FastMoveCloneDodge
  13. 112 FastForwardClone
  14. 96 QuickFreeze
  15. 71 RepairAndProtect
  16. 96 Суперфриз
  17. 93 RovingVirus
  18. 80 ForwardClone
  19. 77 FreezeTag
  20. 68 Палімпсесте
  21. 62 BlockFreezeAttack
  22. 51 RushAttackDodge
  23. 46 Блокер
  24. 40 TurretMaker
  25. 37 Копікат
  26. 37 Камікадзе
  27. 35 FlagInjector
  28. 33 RandomCopier
  29. 31 Підступний
  30. 29 HappyAsAClam
  31. 25 Нановірус
  32. 21 Нуліфікатор
  33. 19 Нановіріс
  34. 17 BoringCopybot
  35. 16 Movebot
  36. 14 Флагбот
  37. 13 Нейтралізатор
  38. 12 Рак
  39. 9 DNAbot
  40. 9 Паразит
  41. 8 MetaInsidious
  42. 8 Ребрендинг
  43. 8 AdaptiveBot
  44. 8 РозмноженняBot
  45. 8 KungFuBot
  46. 5 QuickFreezerbot
  47. 4 Нападник

1
Я буду про все це, як тільки Java стане доступною для тестування.
Wasmoo

2
Я припускаю, що ви ніколи не грали в Основну війну. en.wikipedia.org/wiki/Core_War
matt_black

Я не грав його, але я читав на ньому зовсім небагато, коли писав цей виклик.
Натан Меррілл

У мене є патч для контролера Python і намагався повернути його вам на github ... але у мене немає дозволів / не дуже знаю git. Patch замінює всі "16" s на "num_lines", щоб дозволити записувати / стрибати доступ до останніх 8 інструкцій; також вилучає "max_flag_count = 0" з умови прив'язки в Заяві_flags (), яка інколи присвоює двосторонній зв'язок третьому боту.
adipy

1
Будь-яке ЗНО, коли буде проведено наступний раунд бою? Жодного поспіху. Мені просто цікаво. Спасибі.
COTO

Відповіді:


13

Флагбот

Flag

Навіщо турбуватися робити що-небудь, коли інші боти будуть досить приємні, щоб дати мені свій код?


8

Заморозити тег

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

Надіньте опонента в петлю, заповніть його прапорами, перейдіть до наступного суперника.


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

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

1
Я вклонюся вашому вдосконаленому дизайну і знову зіткнуся з вами у змаганні Bots v. 3 ;)
COTO

Я чесно вважаю, що це було груповим зусиллям з боку всіх. Цього не існувало, якби не кілька ботів, щоб там моделювали. Цікаво, що додавання цього бота повністю реорганізувало табло, оскільки боти, які залежали від блокування, були зламані, тоді як інші, що залежали від заміни прапора, піднімалися.
Wasmoo

Чи може хтось десь узагальнити реальну поведінку Блоку та як цей бот та Lockheed цим скористаються?
Спарр

Кожен рядок може набирати блоки, як описано в HappyAsAClam . Найголовніше, що він не укладається на блоки, викликані з однаковими Cзначеннями. Таким чином, блок може бути укладений, коли викликається з Ifзаяви, що тут використовується. $ Copy розбиває блоки (як молюск), виконуючи Copyна одній і тій же лінії знову і знову до успіху, що надає їй перевагу перед Lockheed.
Васьму

7

Локхид

Моє третє (і, ймовірно, остаточне) подання до цієї конкретної ботової війни: Lockheed Reactor, або "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, який поділився своїм відкриттям "" Блокування змінної кілька разів заблокує кілька разів, якщо другий вислів блоку знаходиться в іншому рядку коду, ніж ваш перший ". просто не справжній "подвиг. Я широко використовую це.

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


Блокування змінної кілька разів не вдається. Однак блокувати це не вдасться лише у тому випадку, якщо: Ви виконуєте той самий рядок ( Ifвказівка ​​на цей рядок не вийде з ладу), Ви блокуєте те саме значення (Один рядок може блокувати лінії 1-24 із збільшенням змінної) та блок ще не було випущено (хтось намагався змінити цю змінну)
Nathan Merrill

Я оспорюю заяву в ОП, оскільки інструкція блоку вводиться в IP, а не в оператор блоку. Таким чином, одна заява блоку може створити до 24 окремих блоків у всіх інструкціях. Я стверджую, що застереження в ОЗ, в якому зазначається, "що поки другий вислів блоку знаходиться в іншому рядку коду, ніж ваш перший", слід внести зміни в "до тих пір, поки блок для пари ( C, <block target>) вже не діє". Тобто рядок, на якій знаходиться оператор блоку, не має значення для складання, за винятком випадків, якщо блок виконується безпосередньо, C= адреса інструкції блоку.
COTO

1
Цей бот дивовижний! Він поєднує в собі всі найкращі поняття. Він захищає себе, поки не знайде ворога, потім подвійно заморожує ворога і завантажує копію себе в ціль, перш ніж вивільнити її у зворотному напрямку. У симуляціях я бачив, як одна з його копій ремонтувала оригінал, який був пошкоджений. ОЦЕ ТАК! Чудова робота, КОТО!
Васьму

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

Цей бот зробив серйозно приголомшливий. І ви бажаєте отримати GUI.
Натан Меррілл

Я оновив його, щоб включити другий цикл, який значно покращив його продуктивність. Я також помітив, що блокування в Java засноване на тому, Cщо заблокувало його. Оскільки у цього бота створений обертовий блок на основі C, він накопичує кілька блоків у кожній його команді. Це робить цього бота додатково захисним.
Васьму

Я розумію, що лише один блок на одну початкову інструкцію може бути встановлений, отже, ваш код вище може встановити лише один блок будь-якої інструкції (а для встановлення одного блоку для кожної інструкції знадобиться цілих 24 * 17 оборотів). Якщо моє розуміння невірно, мова "Блокування змінної кілька разів заблокує кілька разів, якщо другий вислів блоку знаходиться в іншому рядку коду, ніж ваш перший". в ОП потрібно внести зміни, оскільки це твердження (відверто кажучи) помилкове, якщо код Wasmoo здатний встановити кілька блоків у будь-якій інструкції.
COTO

@COTO: Симулятор Java додає по одному блоку на Ifрядок до списку, вводячи Cзмінну, яка його викликала. Тож із блоком 1 і 9 Якщо це виконується оператором Block, бот може отримати до 10 блоків для кожного рядка (займаючи щонайменше 24 * 10 * 10 витків) Можливо, ОП не виконало моделювання правильно.
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". :)


Є дві (легко виправні) проблеми. По-перше, Ifвиписки повинні бути використані з великої літери. По-друге, не повинно бути пробілів по обидва боки від =, як D=*D.
PhiNotPi

Це приголомшлива ідея.
Спарр

Без прапора ви не збираєтесь перемагати.
Paŭlo Ebermann

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 оборотів цього обертається і переходить до іншого суперника.


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, що умовна логіка є безкоштовною. Однак я вирішив залишити це, оскільки ніколи не може бути занадто багато ботів.


цей бот виграє!
justhalf

4

Cadmyllion

"Я щойно увійшов до бота в бойовій роялі", - кажу я. "Він рухається кожні кілька оборотів, щоб запобігти атакам повільніших ботів."

"Що ви маєте на увазі під повільнішими ботами?" - запитує PhiNotPi.

"Боти, які застрягли, оцінюють довгі ланцюги умовної логіки", - відповідаю я.

"Якщо" заяви ", які переспрямовують на інші оператори --- включаючи інші" якщо ", то всі операції виконуються в один і той же поворот", - каже PhiNotPi.

"Солодкі заколочені правила збирання коду!" Я плачу. "Хто придумав цю ідею?"

... і таким чином є історія про те, як виник Cadmyllion.

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

4

Мета підступна

Цей бот заморожується, а потім перетворює опонентів у менш ефективні версії підступних Sparr , що, в свою чергу, перетворить опонентів у ботів, які спамують прапори для мене. Це, мабуть, найскладніший бот, про який я писав, і, таким чином, я очікую, що він стане жахливим, не було місця для блокування, і в коді встановлений лише один прапор. Перетворення бота в підступний клон також займає занадто багато часу.

Найбільшим викликом було написання коду для підступних клонів таким чином, що він працює незалежно від його положення в боті. Заморожування видаляється, коли я вставляю другий до останнього коду саме там, де знаходиться заморозка, це запускає опонента саме вчасно.

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

Це розумна ідея. Однак я не бачу жодних команд Move. Це означає, що ні ваш бот, ні ваш спам-бот не будуть рухатися?
Wasmoo

Підступні клони можуть переміщуватися залежно від того, що є в оригінальному коді ботів, через обмежений простір достатньо q біт функціональності потрібно було викинути, щоб це стало можливим за допомогою 24 рядків. Це було більше розумовим вправою, ніж чим-небудь ще насправді.
супектор

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

Пояснення:

Початкове значення A-0 , а рядки нумеруються 0-23. Якщо Ifоператор виконується і є помилковим, він знову намагається виконати той самий рядок. Контролер не дозволяє боту двічі виконувати один і той же рядок, тому черга закінчується і Cзбільшується до 1.

Наступний рядок, Copy #A #A+8фактично виконується незалежно від значення Ifзаяви. Різниця полягає в тому, що вона виконується двічі, якщо є правдою, і один раз, якщо неправдивою. Якщо рядок #A+8заблоковано (що в кінцевому підсумку трапляється), то виконавши її двічі з фактично копіюванням, виконуючи її один раз, лише розблокуйте її. Потім щойно скопійований рядок блокується для його збереження.


Я намагаюся зрозуміти всіх вас, боти, але я застряг. Які початкові значення A? Чи не так 0? Якщо так, то ваш перший рядок порівняйте рядок 0 з рядком 16, але, як я зрозумів з бота прикладу OP, перший рядок - це рядок 1, чи не так? Крім того, все ще у першому рядку #Cпосилається на цей самий рядок, то чи означає, що якщо Ifвиписка поверне помилковою, ви застрягли в нескінченному циклі?
планнапус

@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Здається, порівняння не налаштовується на зміну суперника правильно, але бот з часом рухається далі.


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 за пораду щодо ефективності


Поздравляю з удару 2k!
bjb568

3

Щасливий, як молюск

Це вправа на блокування. Це виступило надзвичайно добре до цього часу$Copy зійшло.

У молюска є 22 блок-команди. Тому щоA зміщується кожен цикл, вони будуть посилатися на різні лінії кожен раз через цикл. Це дозволяє кожній команді складати блоки на кожному другому рядку, максимум на 22 блоки на рядок. Таким чином, щоб зламати повністю броньований молюск, потрібно було б написати рядок 22 рази.

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

  • Петля 0, А = 0 #10захищена рядком 7 (7+0+3 = 10)
  • Петля 1, А = 7 #10захищена рядком 0 (0+7+3 = 10)
  • Петля 2, А = 14, #10захищена лінією 17 ( 17+14+3= 34 = 10)
  • Петля 3, А = 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

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 , це означає, що жертва завантажила всі рядки і піде на перезавантаження.

Перші версії мого бота не включають блоки. І воно було настільки вразливим, що майже будь-які зміни калічать. Тому я вирішив додати Блоки на основі копії $ Wasmoo (яка базується на Lockheed COTO). Мінусом, який я знайшов, є те, що оригіналу важко виправити помилки в копіях. Але це далеко не калічить, і оцінка значно зросла, тому я тримав Блоки.

ОНОВЛЕННЯ

Я вдосконалив завантажувач, щоб продовжувати намагатися завантажити, поки не вдалося переписати обхід блоків. Це означає, що для завантаження завантажувача потрібен ще один поворот, але мій бал подвоївся після цієї зміни !! Не можна сперечатися з цифрами.


Ще одне оновлення. Як ви могли помітити, MindControl вирішує, чи слід атакувати ціль, порівнюючи випадкову лінію між собою та ціллю. Якщо вони збігаються, MindControl просто припускає, що мета вже заражена, і залиште її в спокої. (Побічна примітка: я використовував для порівняння статичну лінію, але це дає багато хибних позитивів і негативів) Виходить, що дає багато помилкових негативів. Тому я вирішив використовувати ==і зробити деякі незначні зміни , як C+23в 23+C. Програма є функціонально ідентичною, але різною в очах ==. Тепер, коли у MindControl немає лінії, ідентичної будь-якій лінії в будь-якому іншому боті, він на 100% потрапить у будь-який недоторканий бот. Знову оцінка значно зросла.


Знову покращився Завантажувач. Тепер він працює на коротшій петлі. (що, здається, має велику кореляцію з моєю оцінкою)


Покращений Downloader ще раз. Використовується оригінальний код бота, щоб він швидше завантажувався. Також додано 2 випадкових блоки, що, схоже, покращує бал


Це ніколи не надто пізно!
Натан Меррілл

Я розглядаю питання про перейменування на BrainWash ...
TwiNight

Або BunkerBuster після перегляду бюста завантажувача через HappyAsAClam бункер
TwiNight

Я думав спробувати спробувати цю ідею завантаження завантажувача спочатку, але я не міг отримати його таким маленьким, як ви. Чудова робота! Мені також подобається ваше використання D як дельти бродячого блоку; це економить команду і прискорює ваш дизайн. Я вражений, що бот без команди "Перемістити" так добре би працював. Симулятори показують, що боти, як правило, збиваються, але я не знав, що це буде виграшною стратегією. І я погоджуюсь, у розриві молюска є щось однозначно задовільне.
Васьму

@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, але рухайтеся, приймаючи подарунки з кодом, щоб перейти з усіма нашими прапорами.


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

Пробілів немає
Натан Меррілл

@NathanMerrill gotcha
суперактор

2

Маг

Magus - це проста спроба вірусу, що саморозмножується. Він намагається скопіювати себе в програми інших ботів. (Відредаговано, щоб видалити мінусові цифри, виправити стан, обрізати рядки.)

Block #A
Copy #A *#A
Copy A+1 A
If A #0 #4
Copy 0 *C
Flag
Move
Copy 0 C

Негативні значення заборонено. Будь ласка, використовуйте 23 для B
Nathan Merrill

Будь ласка, використовуйте 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++).. .
Ісаак

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

Цей бот відновлює власний код під час руху та атаки.




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

Перші два рядки недійсні. Їм потрібні №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 рази або рухається, або атакує, а потім повторюється. Атака передбачає спробу заморозити опонента, копіювання чотирьох прапорів у випадкові місця, потім повернення.


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

1

Roving Virus

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

Цей бот блукає, поки не знайде ворога, потім заморозить їх, замінить увесь їх код своїм, розморозить їх, потім знову блукає.


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

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

Я з нетерпінням чекаю різниці, яка це призведе. №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

Цей бот намагається випадковим чином знайти прапори у ворожих ботах і замінити їх на дружні прапори, відвертаючись після виявлення успіху. Натхненний раком-ботом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.