Mã Bots 3: Antipotype lập trình song song


13

Chào mừng trở lại! Tôi rất vui mừng được giới thiệu thử thách CodeBots thứ 3. Điều này đã được một thời gian dài trong việc thực hiện. Thử thách này sẽ được chia thành 3 phần: phiên bản ngắn, phiên bản dài và các chi tiết bổ sung.

Phiên bản ngắn

Mỗi đối thủ sẽ viết một chương trình 24 lệnh. Những bot này sẽ di chuyển khắp thế giới và sao chép mã của chúng vào các bot khác, trong khi cố gắng ngăn các bot khác làm điều tương tự. Một trong những lệnh có thể là no-op Flag. Nếu một bot có nhiều của bạn Flaghơn bất kỳ bot nào khác Flag, bạn sẽ nhận được một điểm. Bạn giành chiến thắng bằng cách có nhiều điểm nhất.

Tất cả những điều trên là đúng cho hai thử thách vừa qua. Lần này, các bot sẽ có thể chạy nhiều dòng mã cùng một lúc.

Phiên bản dài

API

Mỗi bot sẽ có chính xác 24 dòng, trong đó mỗi dòng có định dạng sau:

$label command parameters //comments

Nhãn và nhận xét là tùy chọn và mỗi lệnh có số lượng tham số khác nhau. Tất cả mọi thứ là không phân biệt chữ hoa chữ thường.

Thông số

Các tham số được gõ và có thể ở các định dạng sau:

  1. Một giá trị từ 0 đến 23.
  2. Một biến: A, B, C,D
  3. Một giá trị sử dụng phép cộng: A+3hoặc2+C
  4. Một dòng mã, được chỉ định sử dụng #dấu ( #4sẽ đại diện cho dòng thứ 5, trong khi #C+2sẽ đại diện cho dòng được tính theo C+2).
  5. Bạn có thể sử dụng $labelthay vì chỉ định một dòng mã.
  6. Biến hoặc dòng mã của đối thủ của bạn, được chỉ định bởi *. Đối thủ của bạn là bot trong quảng trường mà bạn đang đối mặt. ( *Bđại diện cho Bgiá trị của đối thủ của bạn , trong khi *#9đại diện cho dòng thứ 10 của đối thủ của bạn). Nếu không có ai trong ô vuông đó, lệnh sẽ không được thực thi.

Các lệnh

Di chuyển V

Di chuyển bot North+(V*90 degrees clockwise). Phong trào không đổi hướng.

Biến V

Xoay bot V*90 degreestheo chiều kim đồng hồ.

Sao chép VW

Bản sao bất cứ điều gì là Vvào W. Nếu Vlà số dòng, thì Wphải là số dòng. Nếu Vlà một biến hoặc giá trị, thì Wphải là một biến.

Cờ

Không lam gi cả.

Ngôi sao truyền hình

Bắt đầu một chủ đề mới gắn liền với biến V. Ngay lập tức, và trên mỗi lượt trong tương lai, luồng sẽ thực hiện lệnh trên dòng V.

Nếu Vđã được gắn vào một chủ đề, thì lệnh này là không có. Nếu Vlà biến của đối thủ, thì đối thủ sẽ bắt đầu một chuỗi được gắn vào biến đó.

Dừng V

Dừng luồng được gắn vào biến Vở cuối lượt này.

Khóa V

Ngăn chặn dòng hoặc biến Vđược sử dụng theo bất kỳ cách nào ngoại trừ bởi luồng được gọi Lock. Một cuộc gọi tiếp theo Lockbởi cùng một chủ đề mở ra V. Khóa không thể được gọi trên các biến hoặc dòng của đối thủ.

Nếu Cond

Điều này sẽ kiểm tra Cond. Nếu điều kiện là đúng, thì nó sẽ di chuyển con trỏ luồng đến số dòng V, nếu không thì đến số dòng W. Dòng đó sau đó sẽ được thực hiện ngay lập tức.

Conditionals có thể X=Y, X<Y, !X, hoặc ?X:

  1. X=Y kiểm tra xem hai dòng có cùng loại và từ cùng một bot hay không, hoặc bạn kiểm tra xem hai giá trị có bằng nhau không.
  2. X<Ykiểm tra xem giá trị của Xnhỏ hơn Y.
  3. !Xkiểm tra xem biến hoặc dòng Xcó bị khóa hay không (trả về true nếu bị khóa)
  4. ?X kiểm tra xem một biến đã cho có một luồng được gắn vào nó không

Chi tiết bổ sung

Tương tác đa luồng

Các hành động cùng loại được thực hiện cùng một lúc. Các hành động được thực hiện theo thứ tự sau:

  1. Khóa. Nếu một số luồng cố gắng khóa một biến, tất cả chúng sẽ thất bại. Nếu một luồng đang mở khóa một biến trong khi một luồng khác đang cố khóa nó, thì biến đó sẽ vẫn được mở khóa.

  2. Khởi đầu. Nếu một số luồng cố gắng bắt đầu một luồng trên một biến, nó sẽ được tính là một lần bắt đầu.

  3. Sao chép. Nếu hai luồng cả hai sao chép vào cùng một biến, biến sẽ kết thúc dưới dạng một giá trị ngẫu nhiên. Nếu cả hai đều sao chép vào cùng một dòng, cả hai sẽ không hoạt động. Nếu một luồng sao chép vào cùng một biến mà một luồng khác đang sao chép từ đó thì luồng sau sẽ sao chép một giá trị ngẫu nhiên. Nếu hai luồng đều sao chép từ cùng một biến, cả hai sẽ hoạt động tốt.

  4. Nếu. Tất cả các điều kiện sẽ được kiểm tra đồng thời, và sau đó các biến luồng sẽ được cập nhật sau. Thực hiện một Ifcó thể gây ra một hành động với mức độ ưu tiên cao hơn được thêm vào. Các hành động có mức độ ưu tiên cao hơn sẽ được thực hiện trước khi chuyển qua If, trong khi các hành động có mức độ ưu tiên thấp hơn sẽ thực hiện sau If.

  5. Di chuyển. Nhiều di chuyển trên cùng một bot sẽ di chuyển bot tổng của tất cả các di chuyển. Nếu nhiều bot kết thúc ở cùng một vị trí, chúng sẽ được đưa trở lại vị trí xuất phát.

  6. Xoay. Nhiều lượt trên cùng một bot sẽ tổng hợp.

  7. Dừng lại. Nhiều lệnh dừng trên cùng một biến sẽ được tính là một điểm dừng duy nhất.

Những chi tiết khác

Chủ đề ban đầu của bạn bắt đầu gắn liền với Dbiến

Việc đệ quy với một If(có một Iftuyên bố được chỉ ra) sẽ khiến bot của bạn không làm gì cả

Nếu một chuỗi bị dừng sau khi khóa, những khóa đó sẽ được mở khóa

Các hành động để sử dụng một biến hoặc dòng bị khóa sẽ không làm gì cả.

Nếu một bot ngắn hơn 24 dòng, các dòng còn lại sẽ được lấp đầy Flag

Việc thực hiện ghi trên một biến cũng được gắn vào một luồng bắt đầu sẽ thực sự có luồng bắt đầu thực hiện trên giá trị mới khi luồng bắt đầu lượt sau.

Bots được đặt trong một thế giới hình xuyến theo mẫu sau:

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

Tôi đã thêm một số bot mẫu được nhận xét là tài liệu tham khảo ngôn ngữ.

Bộ điều khiển được đặt ở đây . Tôi đã làm việc rất lâu với nó, nhưng nó có thể vẫn còn lỗi. Khi thông số kỹ thuật và bộ điều khiển mâu thuẫn, thông số kỹ thuật là chính xác.

Bảng điểm

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

Wow, ít nhất, DoubleTap có vẻ tốt hơn nhiều so với các mẫu!
Katenkyo

Điều gì sẽ xảy ra nếu tôi cố đọc một biến bị khóa từ một luồng khác? Nói rằng tôi thực hiện LOCK A sau đó trong một chủ đề khác có M CHUYỂN A. Liệu A có đánh giá về 0 hoặc một giá trị ngẫu nhiên hay di chuyển không thành công hay ...?
Sparr

Ditto về những gì xảy ra khi một luồng đến một dòng bị khóa bởi một luồng khác. Có phải là một noop? Nó có bị bỏ qua không?
Sparr

"Sao chép $ nhãn A" có hoạt động không? Nó diễn giải là "Bản sao số 11 A" không hợp lệ và làm hỏng trình thông dịch, thay vì "Bản sao 11 A" như tôi hy vọng.
Sparr

lỗi có thể xảy ra ... Tôi dường như có thể đọc các dòng cờ của riêng mình để sao chép từ chúng, ngay cả khi chúng bị khóa bởi một luồng khác.
Sparr

Câu trả lời:


3

Khóa máy quét Bot

Quét kẻ thù càng nhanh càng tốt và thay thế các dòng bằng cờ.

    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

Tôi tò mò về điều kiện trong luồng A của bạn. ! * # C kiểm tra xem dòng #C (C) của bạn có bị khóa không? Làm thế nào là hữu ích?
Sparr

@Sparr Chủ đề không lãng phí thời gian thay thế một dòng mã kẻ thù bằng cờ nếu nó bị khóa.
TheNumberOne

Cảm ơn. Tôi đọc sai thông số ban đầu liên quan đến tốc độ của câu lệnh If.
Sparr

3

DoubleTapBot

Bot này có 3 luồng: Một để di chuyển (A), Hai luồng khác để gắn cờ (B và D). Cờ B 1/2 lượt, cờ D 1/3 lượt. Vì vậy, một số lượt, anh ta sẽ tăng gấp đôi cờ đối thủ :).

Tôi giả sử rằng C sẽ trở về 0 nếu vượt quá 23.

Nó sẽ khá an toàn nếu có một số lượt để tự chuẩn bị (8 lượt), vì anh ta sẽ luôn giữ ít nhất 2 luồng (A & B) chạy bình thường.

Tôi không thể thử nó vào lúc này, vì vậy tôi sẽ làm bài kiểm tra khi tôi trở về Trang chủ :)

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 

Số khóa không phải là một lệnh hợp lệ. Tôi đặt dấu # trước mỗi số. Ngoài ra, lệnh là "Xoay", không phải "Xoay"
Nathan Merrill

@NathanMerrill Làm thế nào, đó là một lỗi đánh máy, quên #, cảm ơn vì đã chỉ ra nó. Và lần lượt, sửa đổi bài đăng của bạn để bạn viết Turn V Xoay bot V * 90 độ theo chiều kim đồng hồ. :)
Katenkyo

Oh tôi đã làm. Lần lượt là thực sự chính xác, sau đó, tôi sẽ quay lại và cập nhật mã
Nathan Merrill

Bạn đang khóa 11,12,13 khi bạn có nghĩa là khóa 10,11,12?
Sparr

Wow, cảm ơn vì đã chỉ ra điều đó!
Katenkyo

2

Khóa văn phòng phẩm Double Tap

Lấy cảm hứng từ DoubleTapBot của @ Katenkyo, cái này từ bỏ một vài lá cờ và bất kỳ hy vọng chuyển động nào để đổi lại việc khóa hoàn toàn các chủ đề của chính nó để nó không bao giờ được lập trình lại. Tuy nhiên, vẫn có thể có cờ của kẻ thù được ghi vào các vùng mã không lặp.

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, khóa cờ là một ý tưởng khá hay, tôi nên nghĩ về nó! Dù sao, tôi rất vui vì bot của tôi đã truyền cảm hứng cho ai đó!
Katenkyo

@Katenkyo là một ý tưởng tốt nếu nó hoạt động, nhưng tôi không nghĩ nó nên hoạt động. Quy tắc được viết như đề xuất rằng nếu D khóa dòng cờ thì A / B sẽ không thể sao chép từ đó. Tuy nhiên, điều đó dường như không phải là trường hợp. Báo cáo lỗi trong các ý kiến ​​cho câu hỏi.
Sparr

1

Mover ngẫu nhiên

Di chuyển theo hướng psuedorandom

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

Vỏ dày

Khóa đồ đạc của anh ấy nhiều nhất có thể

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

Bot tấn công

Sao chép cờ vào các địa điểm khác nhau

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

Ba chủ đề

Bot đơn giản này chạy ba chủ đề tất cả với cùng một mã. Mỗi luồng tấn công 1/3 lượt, di chuyển 1/6, biến 1/6 và thực hiện ghi sổ 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

Bot chuối

Nỗ lực ném chuối vào bánh xe kẻ thù trước khi kẻ thù có thể làm bất cứ điều gì. Dễ bị vắt kiệt.

$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

Bot cắt chủ đề

   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

Dừng tất cả các chủ đề của kẻ thù trước khi điền mã của bạn.


0

Sao chép và tự gắn cờ

Bot này chạy ba chủ đề. Chuỗi D di chuyển cho đến khi nó chạy vào kẻ thù, sau đó cố gắng sao chép một lá cờ vào chúng, sau đó di chuyển một hướng ngẫu nhiên. Chuỗi A sao chép cờ của chính nó trên các dòng mã không cần thiết của mã bot. Các chủ đề B chỉ là một bộ đếm. Biến, cờ và dòng mã được sử dụng bởi mỗi luồng được khóa hoàn toàn trong 15 lượt đầu tiên và bot ghi đè lên gần như tất cả mã khởi động của nó bằng cờ riêng. Tôi không nghĩ có thể chuyển đổi bot này sang biểu ngữ của đội khác sau khi bước sang tuổi 15 mà không có bot tấn công chuyên dụng không làm gì ngoài việc viết cờ cho nó.

    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 0là di chuyển về phía bắc, không phải về phía trước.
MegaTom

@MegaTom aha, cảm ơn. Tôi đã bỏ lỡ nó.
Sparr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.