Kod Botları 3: Paralel Programlama Karşılıkları


13

Tekrar hoşgeldiniz! Ben 3 CodeBots meydan okumak için heyecanlıyım. Bu yapımda çok uzun zaman oldu. Bu zorluk 3 bölüme ayrılacaktır: kısa versiyon, uzun versiyon ve ek detaylar.

Kısa Versiyon

Her yarışmacı 24 komutlu bir program yazacaktır. Bu botlar dünya çapında hareket edecek ve diğer botların da aynısını yapmasını engellemeye çalışırken kodlarını diğer botlara kopyalayacaktır. Olası komutlardan biri no-op Flag. Eğer bir bot Flagdiğer botlardan daha fazlasına sahipse Flag, bir puan alırsın. En yüksek puanı alarak kazanırsınız.

Yukarıdakilerin hepsi son iki zorluk için doğruydu. Bu sefer, botlar aynı anda birden fazla kod satırı çalıştırabilecek.

Uzun Versiyon

API

Her bot tam olarak 24 satıra sahip olacaktır, burada her satır aşağıdaki formattadır:

$label command parameters //comments

Etiketler ve yorumlar isteğe bağlıdır ve her komutun farklı sayıda parametresi vardır. Her şey büyük / küçük harfe duyarlı değildir.

Parametreler

Parametreler yazılmıştır ve aşağıdaki biçimlerde olabilir:

  1. 0 ile 23 arasında bir değer.
  2. Bir değişken: A, B, C,D
  3. Toplama kullanan bir değer: A+3veya2+C
  4. #İşaret kullanılarak belirlenen bir kod satırı ( #45. satırı #C+2temsil ederken , hesaplanan satırı temsil eder C+2).
  5. Bir $labelkod satırı belirtmek yerine kullanabilirsiniz .
  6. Rakibiniz tarafından belirtilen değişken veya kod satırı *. Rakibiniz karşı karşıya olduğunuz karedeki bottur. ( *Brakibinizin Bdeğerini, *#9rakibinizin 10. çizgisini temsil eder). Bu karede kimse yoksa, komut yürütülmez.

Komutları

Hareket V

Botu hareket ettirir North+(V*90 degrees clockwise). Hareket yön değiştirmez.

V dönüşü

Botu V*90 degreessaat yönünde çevirir.

VW kopyala

Ne varsa kopyalar Viçine W. Eğer Vbir satır numarası, sonra Wbir satır numarası olmak zorundadır. VBir değişken veya değer ise , bir değişken Wolmalıdır.

bayrak

Hiç birşey yapmıyor.

Star TV

Değişkene bağlı yeni bir iş parçacığı başlatır V. Hemen ve gelecekteki her dönüşte, iş parçacığı komutu çevrimiçi olarak yürütür V.

Eğer Vzaten bir iş parçacığı bağlı, o zaman bu komut no-operasyon. Bir Vrakibin değişkeni ise, rakip bu değişkene bağlı bir iş parçacığı başlatacaktır.

Durdurma V

VBu dönüşün sonunda değişkene eklenen iş parçacığını durdurur .

Kilit V

Çizginin veya değişkenin çağrılan iş parçacığı dışında herhangi bir şekildeV kullanılmasını önleyin . Aynı iş parçacığına yapılan bir sonraki çağrı kilidi açılır . Kilitler rakibin değişkenleri veya hatlarında aranamaz.LockLockV

Cond VW ise

Bu test edecek Cond. Koşul doğruysa, iplik işaretçisini satır numarasına V, aksi takdirde satır numarasına taşır W. Daha sonra bu hat hemen yürütülür.

Şartlı olabilir X=Y, X<Y, !X, veya ?X:

  1. X=Y iki satırın aynı türde ve aynı botta olup olmadığını ya da iki değerin aynı miktara eşit olup olmadığını test edin.
  2. X<Ydeğeri test eder Xaz olan Y.
  3. !Xdeğişkenin veya satırın Xkilitli olup olmadığını test eder (kilitliyse true değerini döndürür)
  4. ?X belirli bir değişkenin kendisine bağlı bir iş parçacığı olup olmadığını test eder

ek detaylar

Çok iş parçacıklı etkileşimler

Aynı türde eylemler aynı anda yürütülür. Eylemler aşağıdaki sırayla yürütülür:

  1. Kilit. Birkaç iş parçacığı bir değişkeni kilitlemeye çalışırsa, bunların tümü başarısız olur. Bir iş parçacığı başka bir değişkeni kilitlemeye çalışırken değişkenin kilidini kaldırıyorsa, değişkenin kilidi açık kalır.

  2. Başlat. Birkaç iş parçacığı bir değişken üzerinde iş parçacığı başlatmaya çalışırsa, tek bir başlangıç ​​olarak sayılır.

  3. Kopya. İki iş parçacığı aynı değişkene kopyalanırsa, değişken rastgele bir değer olarak sonuçlanır. İkisi de aynı satıra kopyalanırsa, ikisi de çalışmaz. Bir iş parçacığı başka bir iş parçacığından aynı değişkene kopyalanıyorsa, ikinci iş parçacığı rastgele bir değer kopyalar. İki iş parçacığı aynı değişkenden kopyalanıyorsa, ikisi de iyi çalışır.

  4. Eğer. Tüm şartlar aynı anda test edilecek ve daha sonra evre değişkenleri daha sonra güncellenecektir. Bir'in çalıştırılması, Ifdaha yüksek önceliğe sahip bir eylemin eklenmesine neden olabilir. Daha yüksek önceliğe sahip Ifeylemler , geçmişine geçmeden önce , daha düşük önceliğe sahip eylemler ise If.

  5. Hareket. Aynı bot üzerindeki çoklu hareketler, botun tüm hareketlerin toplamını hareket ettirir. Birden fazla bot aynı noktaya gelirse, başlangıç ​​noktalarına geri döneceklerdir.

  6. Çevirin. Aynı bot üzerinde çoklu dönüşler toplanır.

  7. Dur. Aynı değişken üzerindeki birden fazla durdurma komutu tek bir durdurma olarak sayılır.

Diğer detaylar

İlk iş parçacınız Ddeğişkene eklenmeye başlar

If( IfKendisine işaret eden bir ifadeyle) tekrarlamak botunuzun hiçbir şey yapmamasına neden olur

Bir iplik kilitlendikten sonra durdurulursa, bu kilitlerin kilidi açılacaktır

Kilitli bir değişken veya satırı kullanma eylemleri hiçbir şey yapmaz.

Bir bot 24 satırdan daha kısaysa, kalan satırlar Flag

Bir başlangıç ​​iş parçacığına da bağlı olan bir değişken üzerinde yazma işlemi iş parçacığının sonraki dönüşü başlattıkça iş parçacığının yeni değerde yürütülmesine başlamasını sağlar.

Botlar aşağıdaki desende toroidal bir dünyaya yerleştirilir:

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

Bir dil başvurusu olarak yorumlanan birkaç örnek bot ekledim .

Denetleyici burada bulunur . Üzerinde uzun süre çalıştım, ama muhtemelen hala hataları var. Teknik özellik ve denetleyici çeliştiğinde, teknik özellik doğrudur.

sayı tahtası

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

Vay be, en azından DoubleTap numunelerden çok daha iyi görünüyor!
Katenkyo

Kilitli bir değişkeni başka bir iş parçacığından okumaya çalışırsam ne olur? Diyelim ki KİLİT A yapıyorum sonra başka bir iş parçacığında bir MOVE A var. A 0 veya rasgele bir değer mi değerlendiriyor yoksa taşıma başarısız mı yoksa ...?
Sparr

Bir iş parçacığı, başka bir iş parçacığı tarafından kilitlenmiş bir satıra ulaştığında neler olduğunu belirtir. Noop mu? Atlanıyor mu?
Sparr

"Copy $ label A" işe yarıyor mu? Bu, umarım beklediğim gibi "Kopya 11 A" yerine geçerli değil ve yorumlayıcıyı çöker.
Sparr

olası hata ... Başka bir iş parçacığı tarafından kilitli olsa bile, onlardan kopyalamak için kendi bayrak satırlarımı okuyabiliyor gibi görünüyor.
Sparr

Yanıtlar:


3

Kilitli Tarayıcı Botu

Düşmanı olabildiğince hızlı tarar ve hatları bayraklarla değiştirir.

    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

A iş parçacığındaki koşulunu merak ediyorum. ! * # C, hedefinizin #C hattının (C) kilitli olup olmadığını kontrol eder, değil mi? Bu nasıl yardımcı olur?
Sparr

@Sparr A iş parçacığı, düşman kodunun bir satırını kilitliyse bir bayrakla değiştirmek için zaman kaybetmez.
TheNumberOne

Teşekkürler. Başlangıçta If ifadelerinin hızı ile ilgili özellikleri yanlış okudum.
Sparr

3

DoubleTapBot

Bu botun 3 dişi vardır: Biri hareket etmek için (A), diğer ikisi işaretlemek için (B ve D). B bayrağı 1/2 tur, D bayrağı 1/3 tur. Yani bir süre, rakibini iki katına çıkarır :).

23'ü aşarsa C'nin 0'a döneceğini varsayıyorum.

Her zaman en az 2 dişi (A & B) normal şekilde çalıştıracağından, kendini hazırlamak için biraz turu varsa (8 tur) oldukça güvenli olmalıdır.

Şu anda deneyemiyorum, bu yüzden eve döndüğümde testi yapacağım :)

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 

Kilit numarası geçerli bir komut değil. Her sayının önüne # işareti koydum. Ayrıca, komut "Döndür", "Döndür" değil
Nathan Merrill

@NathanMerrill Nasıl, bu bir yazım hatası, # unutma, işaret ettiğin için teşekkürler. Ve sırayla, yazınızı değiştirin, böylece Turn V yazdınız Bot V * saat yönünde 90 derece döner. :)
Katenkyo

Yaptım. Dönüş aslında doğru, o zaman geri dönüp kodu güncelleyeceğim
Nathan Merrill

10,11,12'yi kilitlemek istediğinizde 11,12,13'ü mi kilitliyorsunuz?
Sparr

Vay canına, işaret ettiğin için teşekkürler!
Katenkyo

2

Kilitli Sabit Çift Musluk

@ Katenkyo'nun DoubleTapBot'undan esinlenen bu, kendi bayraklarını tamamen kilitlemek için birkaç bayrak ve herhangi bir hareket umudundan vazgeçiyor, böylece yeniden programlanamıyor. Ancak yine de, döngüsel olmayan kod alanlarına düşman bayraklarının yazılması hala mümkündür.

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

Haha, Bayrağı kilitlemek oldukça iyi bir fikir, bunu düşünmeliydim! Her neyse, botumun birine ilham verdiğine sevindim!
Katenkyo

@Katenkyo Çalışıyorsa iyi bir fikir, ama çalışması gerektiğini düşünmüyorum. Yazılı kurallar, D'nin bayrak satırını kilitlemesi durumunda A / B'nin kopyalayamayacağını gösterir. Ancak, durum böyle görünmüyor. Soruya yapılan yorumda hata raporu.
Sparr

1

Rastgele Taşıyıcı

Bir pervane yönünde hareket eder

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

Kalın Kabuklu

Eşyalarını olabildiğince kilitler

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

Saldırgan Bot

Bayrakları çeşitli konumlara kopyalar

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

Üçlü İplik

Bu basit bot, hepsi aynı kodla üç iş parçacığı çalıştırır. Her iş parçacığı 1/3 tur atak yapar, 1/6 hareket eder, 1/6 döner ve defter tutma 1/3 yapar.

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

Muz Botu

Düşman herhangi bir şey yapmadan önce düşman çarkına muz atma girişimleri. Ezilmeye yatkın.

$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

İplik Kesici Bot

   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

Kodunuzu doldurmadan önce tüm düşman dişlerini durdurun.


0

Kopyalama ve Öz Bayrak

Bu bot üç iş parçacığı çalıştırır. D iş parçacığı bir düşmana girene kadar hareket eder, daha sonra onlara bir bayrak kopyalamaya çalışır, sonra rastgele bir yön taşır. A iş parçacığı, kendi bayrağını bot kodunun zorunlu olmayan satırlarına kopyalar. B dişi sadece bir sayaçtır. Her bir iş parçacığı tarafından kullanılan değişken, bayrak ve kod satırları ilk 15 turda tamamen kilitlenir ve bot başlangıç ​​kodunun neredeyse tümünün üzerine kendi bayraklarıyla yazar. 15 yaşından sonra bu botu, bayrak yazmaktan başka bir şey yapmadan özel bir saldırı botu olmadan başka bir takımın afişine dönüştürmenin mümkün olduğunu düşünmüyorum.

    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 0ileriye değil kuzeye doğru hareket eder.
MegaTom

@MegaTom aha, teşekkürler. Onu özledim.
Sparr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.