Коди-боти 3: антипараметри паралельного програмування


13

З поверненням! Я з радістю представляю третє завдання CodeBots. Цей вже давно в процесі створення. Це завдання буде розділено на 3 розділи: коротка версія, довга версія та додаткові деталі.

Коротка версія

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

Все вищесказане стосувалось двох останніх викликів. Цього разу боти зможуть одночасно запускати кілька рядків коду.

Довга версія

API

Кожен бот матиме рівно 24 рядки, де кожен рядок має такий формат:

$label command parameters //comments

Мітки та коментарі необов’язкові, і кожна команда має різну кількість параметрів. Все не залежно від регістру.

Параметри

Параметри набираються і можуть мати такі формати:

  1. Значення від 0 до 23.
  2. Змінна: A, B, C,D
  3. Значення з використанням додавання: A+3або2+C
  4. Рядок коду, який позначається за допомогою #знака ( #4представляв би 5-й рядок, тоді як #C+2представляв би рядок, обчислений за C+2).
  5. Ви можете використовувати $labelзамість позначення рядка коду.
  6. Змінна або рядок коду опонента, позначений *. Ваш опонент - бот на площі, перед якою ви стикаєтесь. ( *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:

  1. X=Y перевіряє, чи є два рядки одного типу і від одного бота, або ви перевіряєте, чи два значення однакові.
  2. X<Yперевіряє, чи є значення Xменше Y.
  3. !Xперевіряє Xзаблокованість змінної чи рядка (повертає значення true, якщо заблоковано)
  4. ?X перевіряє, чи є дана змінна приєднана до неї нитка

Додаткові відомості

Багатопотокові взаємодії

Дії одного типу виконуються одночасно. Дії виконуються в такому порядку:

  1. Блокування. Якщо кілька потоків спробують заблокувати змінну, всі вони вийдуть з ладу. Якщо потік розблокує змінну, а інша намагається її заблокувати, змінна залишиться розблокованою.

  2. Старт. Якщо кілька потоків намагаються запустити потік у змінній, вона вважатиметься одним запуском.

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

  4. Якщо. Всі умови будуть перевірені одночасно, а потім змінні потоку будуть оновлені після. Виконання документа Ifможе спричинити додавання дії з більш високим пріоритетом. Дії з більш високим пріоритетом виконуватимуться перед переміщенням минулого If, тоді як дії з нижчим пріоритетом виконуватимуться після If.

  5. Рухатися. Кілька ходів на одному боті перемістять бота суму всіх ходів. Якщо кілька ботів опиняться в одному місці, вони будуть повернуті на їх місце початку.

  6. Поворот. Кілька оборотів на одному боті будуть підсумовувати.

  7. Стій. Кілька команд зупинки на одній змінній рахуватимуться як одна зупинка.

Інші деталі

Ваш початковий потік починає прикріплюватися до Dзмінної

Повторення IfIfзаявою вказує на себе) не призведе до того, що ваш бот нічого не робить

Якщо нитка буде зупинена після блокування, ці блокування будуть розблоковані

Дії щодо використання заблокованої змінної чи рядка нічого не дадуть.

Якщо бот коротший, ніж 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

Нічого собі, принаймні, DoubleTap здається набагато кращим, ніж зразки!
Katenkyo

Що має статися, якщо я спробую прочитати заблоковану змінну з іншого потоку? Скажіть, я роблю LOCK A, то в іншому потоці є MOVE A. Чи оцінюється A до 0 або випадковому значенню, або переміщення провалюється або ...?
Спарр

Визначте те, що відбувається, коли нитка досягне лінії, замкненої іншою ниткою. Це ніоп? Це пропускається?
Спарр

Чи повинен працювати "Копіювати $ label"? Це трактується як "Копіювати №11", що не є дійсним, і перетворює інтерпретатор замість "Скопіювати 11 А", як я би сподівався.
Спарр

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

Відповіді:


3

Заблокований сканер-бот

Якнайшвидше сканує противника і замінює лінії прапорами.

    Lock D
    Copy $a A
    Start A
    Copy $b B
    Start B

$d  Lock $d0
    Lock $d1    
$d0 Copy $flag *#C+1
$d1 If 1=1 $d0 $d0

$a  Lock A
    Lock $a0
    Lock $a1
    Lock $a2
$a0 Copy $flag *#C
$a1 Copy C+2 C
$a2 If !*#C $a1 $a0

$b  Lock B
    Lock $b0
    Lock $b1
    Lock $b2
$b0 Move C
$b1 Turn 1
$b2 If 1=1 $b0 $b0

$flag Flag

Мені цікаво умовне у вашій А темі. ! * # C перевіряє, чи заблоковано рядок # C (ваш C) цілі, правда? Чим це корисно?
Спарр

@Sparr Нитка не витрачає час замінюючи рядок коду ворога прапором, якщо він заблокований.
TheNumberOne

Спасибі. Я спочатку неправильно прочитав специфікацію щодо швидкості тверджень If.
Спарр

3

DoubleTapBot

Цей бот має 3 нитки: один для переміщення (A), два інших для позначення (B і D). B прапор 1/2 обороту, D прапор 1/3 обороту. Тож дещо черга, він подвоїть прапора суперника :).

Я припускаю, що C повернеться до 0, якщо він перевищить 23.

Він повинен бути досить безпечним, якщо у нього є деяка черга, щоб підготуватися (8 оборотів), оскільки він завжди буде тримати принаймні 2 нитки (A & B) у звичайному режимі.

Наразі не можу спробувати, тому я зроблю тест, коли повернусь додому :)

Lock D          //Thread D locks itself
Copy 6 A        //Thread A will start line 6
Start A     
Copy 13 B       //Thread B will start line 13
Start B        
Copy 20 D       //Moving Thread D to an other part of the program
Lock A          //Thread A locks itself and the line it will be using
Lock #10
Lock #11
Lock #12
Move C          //Move in a pseudo random direction
Turn 1      //always turn to the right
If 1=1 #10 #10  //return to Move C
Lock B          //Thread B locks itself and the line it will be using
Lock #13
Lock #14
Copy #18 *#C    //Copy a flag to the Cth line of the opponent
If 1=1 #16 #16  //jump back to the copy
Flag   
Flag   
Copy C+1 C      //Increment C
Copy #19 *#C+1  //Copy a flag to the Cth+1 line of the opponent
If 1=1 #20 #20  //jump back to the increment
Flag 

Номер блокування не є дійсною командою. Я ставив # знаків перед кожним із чисел. Також команда "Поворот", а не "Поворот"
Натан Меррілл

@NathanMerrill Як це, помилка друку, забудьте #, спасибі за вказівку. А для повороту змініть свій пост так, що ви написали Turn V Повертає бота V * 90 градусів за годинниковою стрілкою. :)
Katenkyo

О, я зробив. Поворот насправді правильний, тоді я повернусь та оновлю код
Натан Меррілл

Ви блокуєте 11,12,13, коли маєте на увазі заблокувати 10,11,12?
Спарр

Нічого, дякую, що вказали на це!
Katenkyo

2

Блокований стаціонарний подвійний торкніться

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

Lock $flag              // lock the only flag line, super important!
Lock D                  // lock thread D
Copy 10 A
Start A                 // start thread A at $Astart
Copy 17 B
Start B                 // start thread B at $Bstart
Lock $D1                // lock thread D lines
Lock $D2                // thread D should be safe on turn 8
$D1 Turn C              // Spin in place, once every 2 turns
$D2 If 0=0 $D1 $D1      // thread D loop
$Astart Lock A          // thread A starts here, locks itself
Lock $A1                // lock thread A lines
Lock $A2
Lock $A3                // thread A should be safe on turn 7
$A1 Copy $flag *#C      // ATTACK! once every 3 turns
$A2 Copy C+1 C          // increment C, used for attacks and turning
$A3 If 0=0 $A1 $A1      // thread A loop
$Bstart Lock B          // thread B starts here, locks itself
Lock $B1                // lock thread B lines
Lock $B2                // thread B should be safe on turn 8
$B1 Copy $flag *#C+12   // ATTACK! once every 2 turns
$B2 If 0=0 $B1 $B1      // thread B loop
$flag Flag

Ха-ха, замикати прапор - це дуже гарна ідея, я мав би подумати про це! У всякому разі, я радий, що мій бот комусь дав натхнення!
Katenkyo

@Katenkyo це гарна ідея, якщо це працює, але я не думаю, що це має працювати. Як написано правила передбачає, що якщо D заблокує рядок прапора, то A / B не зможе скопіювати з нього. Однак це, мабуть, не так. Повідомте про помилку в коментарях до питання.
Спарр

1

Випадковий переїзд

Рухається в псевдослучайному напрямку

Copy 5 C
Copy 8 B
Start C
Move A // If you can't catch me, you can't modify me
If 1=1 #3 #3 //Continue to execute the above line
Start B
Copy 4 A
If 1=1 #6 #6 //Continue to execute the above line
Flag
Copy 5 A
If 1=1 #9 #9 //Continue to execute the above line

1

Товстий обстріл

Блокує свої речі стільки, скільки зможе

Copy 5 B //Designating that the B thread will start on line 5
Start B //Starting the B thread
Lock C //Preventing C from being used
Copy A+1 A //The two threads are offset, meaning that the two threads shouldn't access this at the same time
Lock #A
Copy 2 B

1

Нападник Бот

Копіює прапори в різні місця

Copy A+1 A // Increment A
Move A //Move in the Ath direction
Turn A //Rotate A times
Copy #8 *#A //Copy my flag over
Copy 23 D //Loop back to the beginning.  (I use 23 here as threads auto-increment)

0

Потрійна нитка

Цей простий бот виконує три нитки, все з тим самим кодом. Кожна нитка атакує 1/3 оборотів, рухається 1/6, повертає 1/6, і веде бухгалтерію 1/3.

Move 0
Start A
Start B
$loop Copy #A+9 *#C
Move C
Copy #A+9 *#C
Turn C
Copy C+1 C
If 0=0 $loop $loop

0

Банановий бот

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

$d     If !*D $d1 $d0
$d0    Copy 24 *D
$d1    If !D $d2 $start
$d2    If !*B $d5 $d3
$d3    Copy 24 *B
$d4    Copy $d D

$start Lock D             //Banana's like to split.
       Copy $a A
       Start A
       Copy $b B
       Start B
       Lock $flag

$d5    Copy $start *C     //It's okay if enemy messes up our start.
       Copy $d d

$a     Lock A
$a1    Move C
       Turn 1
       Copy $a1 A

$b     Lock B
$b0    Copy C+1 C
       If !*#C $b0 $b1    //Banana's are good at slipping.
$b1    Copy $flag *#C
$b2    Copy $b0 B

$flag  Flag

0

Різьба різьблення різьби

   Lock D
   Lock $f
   Copy 16 C
$S If ?*D $1 $2
   Move 1
   Copy $S D
$f Flag
$1 Stop *D
$2 If ?*A $3 $4
$3 Stop *A
$4 If ?*B $5 $6
$5 Stop *B
$6 Copy $f *#C
   Copy C+1 C
   If *#C=#C $E $6
   Copy 2 D
$E Start *D

Зупиніть усі ворожі потоки перед тим, як заповнити свій код.


0

Копія та власний прапор

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

    Lock D              // Lock D thread
    Copy $AS A
    Start A             // Start A thread at $AS
    Start B             // B is just a counter
    Copy $DL D          // Jump to D thread startup code
$DC Start B             // Don't let B thread get stopped
$D0 If !*#B $D1 $D2
$D1 Copy $DF *#B
$D2 If !*#B+6 $D3 $DM
$D3 Copy $DF *#B
$DM Move B              // Move some direction after attacking
$DA Move 0              // Move north ...
    If ?*D $DC $DA      // until we hit a live target
$DF Flag                // Flag to copy
$DL Lock #B+3           // Lock the D thread's lines
    If B<12 $DL $DA     // jump to `Move 0` when D thread is safe
$AS Lock A
$AL Lock #B+20
    If B<4 $AL $AD
    Copy 23 B           // reset B so A doesn't overwrite its own code
$AF Flag
    Flag
$AD Copy $AF #B+1       // Copy a safe flag over every unused line of code
    If B<18 $AD $AF

Move 0рухається на північ, а не вперед.
MegaTom

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