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 Flag
hơ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:
- Một giá trị từ 0 đến 23.
- Một biến:
A
,B
,C
,D
- Một giá trị sử dụng phép cộng:
A+3
hoặc2+C
- Một dòng mã, được chỉ định sử dụng
#
dấu (#4
sẽ đại diện cho dòng thứ 5, trong khi#C+2
sẽ đại diện cho dòng được tính theoC+2
). - Bạn có thể sử dụng
$label
thay vì chỉ định một dòng mã. - 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 choB
giá 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 degrees
theo chiều kim đồng hồ.
Sao chép VW
Bản sao bất cứ điều gì là V
vào W
. Nếu V
là số dòng, thì W
phải là số dòng. Nếu V
là một biến hoặc giá trị, thì W
phả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 V
là 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 Lock
bở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
:
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.X<Y
kiểm tra xem giá trị củaX
nhỏ hơnY
.!X
kiểm tra xem biến hoặc dòngX
có bị khóa hay không (trả về true nếu bị khóa)?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:
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.
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.
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.
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
If
có 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 quaIf
, trong khi các hành động có mức độ ưu tiên thấp hơn sẽ thực hiện sauIf
.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.
Xoay. Nhiều lượt trên cùng một bot sẽ tổng hợp.
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 D
biến
Việc đệ quy với một If
(có một If
tuyê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