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 Flagdaripada 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+3atau2+C - Baris kode, yang ditunjuk menggunakan
#tanda (#4akan mewakili baris 5, sementara#C+2akan mewakili baris yang dihitung olehC+2). - Anda dapat menggunakan
$labelalih - alih menunjuk satu baris kode. - Variabel atau garis kode lawan Anda, yang ditentukan oleh
*. Lawan Anda adalah bot di kotak yang Anda hadapi. (*BmewakiliBnilai lawan Anda , sementara*#9mewakili 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 degreessearah jarum jam.
Salin VW
Menyalin apa pun yang ada di Vdalamnya W. Jika Vnomor baris, maka Wharus nomor baris. Jika Vvariabel atau nilai, maka Wharus 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 Vsudah terlampir pada utas, maka perintah ini adalah no-op. Jika Vvariabel lawan, maka lawan akan memulai utas yang melekat pada variabel itu.
Stop V
Hentikan utas yang terlampir pada variabel Vdi akhir giliran ini.
Kunci V
Cegah baris atau variabel Vagar tidak digunakan dengan cara apa pun kecuali oleh utas yang memanggil Lock. Panggilan berikutnya Lockoleh 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=Ymenguji apakah dua baris dari jenis yang sama dan dari bot yang sama, atau Anda menguji apakah dua nilai sama dengan jumlah yang sama.X<Ymenguji apakah nilaiXkurang dariY.!Xmenguji apakah variabel atau garisXterkunci (mengembalikan true jika terkunci)?Xmenguji 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
Ifdapat 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 Dvariabel
Berulang dengan If(memiliki Ifpernyataan 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