Selamat datang kembali! Saya senang dapat menyajikan tantangan CodeBots ke-3. Yang ini sudah lama dibuat. Tantangan ini akan dibagi menjadi 3 bagian: versi pendek, versi panjang, dan detail tambahan.
Versi Pendek
Setiap pesaing akan menulis program 24-perintah. Bot ini akan bergerak di seluruh dunia dan menyalin kodenya ke bot lain, sambil mencoba mencegah bot lain melakukan hal yang sama. Salah satu perintah yang mungkin adalah no-op Flag
. Jika bot memiliki lebih banyak dari bot Anda Flag
daripada yang lain Flag
, Anda mendapatkan poin. Anda menang dengan memiliki poin terbanyak.
Semua hal di atas berlaku untuk dua tantangan terakhir. Kali ini, bot akan dapat menjalankan beberapa baris kode secara bersamaan.
Versi Panjang
API
Setiap bot memiliki tepat 24 baris, di mana setiap baris dalam format berikut:
$label command parameters //comments
Label dan komentar adalah opsional, dan setiap perintah memiliki jumlah parameter yang berbeda. Semuanya tidak peka huruf besar-kecil.
Parameter
Parameter diketik, dan bisa dalam format berikut:
- Nilai dari 0 hingga 23.
- Sebuah variabel:
A
,B
,C
,D
- Nilai menggunakan tambahan:
A+3
atau2+C
- Baris kode, yang ditunjuk menggunakan
#
tanda (#4
akan mewakili baris 5, sementara#C+2
akan mewakili baris yang dihitung olehC+2
). - Anda dapat menggunakan
$label
alih - alih menunjuk satu baris kode. - Variabel atau garis kode lawan Anda, yang ditentukan oleh
*
. Lawan Anda adalah bot di kotak yang Anda hadapi. (*B
mewakiliB
nilai lawan Anda , sementara*#9
mewakili garis 10 lawan Anda). Jika tidak ada seorang pun di alun-alun itu, perintah tidak dieksekusi.
Perintah
Pindahkan V
Memindahkan bot North+(V*90 degrees clockwise)
. Gerakan tidak mengubah arah.
Putar V
Mengubah bot V*90 degrees
searah jarum jam.
Salin VW
Menyalin apa pun yang ada di V
dalamnya W
. Jika V
nomor baris, maka W
harus nomor baris. Jika V
variabel atau nilai, maka W
harus variabel.
Bendera
Tidak melakukan apa-apa.
Mulai V
Mulai utas baru yang dilampirkan ke variabel V
. Segera, dan pada setiap giliran berikutnya, utas akan mengeksekusi perintah on line V
.
Jika V
sudah terlampir pada utas, maka perintah ini adalah no-op. Jika V
variabel lawan, maka lawan akan memulai utas yang melekat pada variabel itu.
Stop V
Hentikan utas yang terlampir pada variabel V
di akhir giliran ini.
Kunci V
Cegah baris atau variabel V
agar tidak digunakan dengan cara apa pun kecuali oleh utas yang memanggil Lock
. Panggilan berikutnya Lock
oleh utas yang sama membuka V
. Kunci tidak dapat dipanggil pada variabel atau garis lawan.
Jika Cond VW
Ini akan menguji Cond
. Jika kondisinya benar, maka itu akan memindahkan penunjuk utas ke nomor baris V
, jika tidak ke nomor baris W
. Baris itu kemudian akan segera dieksekusi.
Conditional bisa X=Y
, X<Y
, !X
, atau ?X
:
X=Y
menguji apakah dua baris dari jenis yang sama dan dari bot yang sama, atau Anda menguji apakah dua nilai sama dengan jumlah yang sama.X<Y
menguji apakah nilaiX
kurang dariY
.!X
menguji apakah variabel atau garisX
terkunci (mengembalikan true jika terkunci)?X
menguji apakah variabel yang diberikan memiliki utas yang melekat padanya
detil tambahan
Interaksi multi-utas
Tindakan dengan tipe yang sama dieksekusi pada waktu yang sama. Tindakan dieksekusi dalam urutan berikut:
Mengunci. Jika beberapa utas mencoba mengunci variabel, semuanya akan gagal. Jika utas membuka kunci variabel sementara yang lain mencoba menguncinya, variabel akan tetap tidak terkunci.
Mulailah. Jika beberapa utas mencoba memulai utas pada variabel, itu akan dihitung sebagai satu permulaan.
Salinan. Jika dua utas sama-sama menyalin ke variabel yang sama, variabel tersebut akan berakhir sebagai nilai acak. Jika keduanya menyalin ke baris yang sama, keduanya tidak akan berfungsi. Jika utas menyalin ke variabel yang sama dengan utas lain, maka utas yang terakhir akan menyalin nilai acak. Jika dua utas sama-sama menyalin dari variabel yang sama, keduanya akan berfungsi dengan baik.
Jika. Semua kondisional akan diuji secara bersamaan, dan kemudian variabel utas akan diperbarui setelahnya. Menjalankan dan
If
dapat menyebabkan tindakan dengan prioritas lebih tinggi akan ditambahkan. Tindakan dengan prioritas lebih tinggi akan dieksekusi sebelum bergerak melewati masa laluIf
, sementara tindakan dengan prioritas lebih rendah akan dieksekusi setelahIf
.Pindah. Beberapa gerakan pada bot yang sama akan memindahkan bot jumlah dari semua gerakan. Jika beberapa bot berakhir di tempat yang sama, mereka akan dikembalikan ke tempat awal mereka.
Belok. Beberapa belokan pada bot yang sama akan dijumlahkan.
Berhenti. Beberapa perintah berhenti pada variabel yang sama akan dihitung sebagai perhentian tunggal.
Detail lainnya
Utas awal Anda mulai dilampirkan ke D
variabel
Berulang dengan If
(memiliki If
pernyataan menunjuk ke dirinya sendiri) akan menyebabkan bot Anda tidak melakukan apa pun
Jika utas dihentikan setelah penguncian, kunci itu akan dibuka kuncinya
Tindakan menggunakan variabel atau garis yang dikunci tidak akan menghasilkan apa-apa.
Jika bot lebih pendek dari 24 baris, baris yang tersisa akan diisi Flag
Melakukan penulisan pada variabel yang juga dilampirkan ke utas awal sebenarnya akan membuat utas memulai pelaksanaannya pada nilai baru saat utas memulai belokan berikut.
Bot ditempatkan di dunia toroidal dalam pola berikut:
B...B...B...
..B...B...B.
B...B...B...
Saya telah menambahkan beberapa bot sampel yang dikomentari sebagai referensi bahasa.
Pengontrol terletak di sini . Saya sudah bekerja lama, tapi mungkin masih ada bug. Ketika spec dan controller bertentangan, spec sudah benar.
Papan angka
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