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
sumber
Jawaban:
Bot Pemindai Terkunci
Memindai musuh secepat mungkin dan mengganti garis dengan bendera.
sumber
DoubleTapBot
Bot ini memiliki 3 utas: Satu untuk bergerak (A), Dua lainnya untuk menandai (B dan D). B flag 1/2 turn, D flag 1/3 turn. Jadi beberapa giliran, dia akan menggandakan bendera lawan :).
Saya berasumsi bahwa C akan kembali ke 0 jika melebihi 23.
Seharusnya cukup aman jika ada giliran untuk mempersiapkan diri (putaran 8), karena ia akan selalu menjaga setidaknya 2 utas (A & B) berjalan normal.
Saya tidak dapat mencobanya saat ini, jadi saya akan melakukan tes ketika saya akan kembali ke Rumah :)
sumber
Ketuk Stationary Terkunci Ketuk
Terinspirasi oleh DoubleTapBot @ Katenkyo, yang satu ini memberikan beberapa bendera dan harapan pergerakan sebagai balasan untuk benar-benar mengunci utasnya sendiri sehingga tidak dapat diprogram ulang. Namun, masih rentan untuk memiliki bendera musuh yang ditulis ke area kode non-looping.
sumber
Penggerak acak
Bergerak ke arah psuedorandom
sumber
Tebal dikupas
Mengunci barang-barangnya sebanyak yang dia bisa
sumber
Bot Penyerang
Menyalin bendera ke berbagai lokasi
sumber
Triple Thread
Bot sederhana ini menjalankan tiga utas dengan kode yang sama. Setiap utas menyerang 1/3 putaran, bergerak 1/6, putaran 1/6, dan melakukan pembukuan 1/3.
sumber
Bot Pisang
Mencoba melempar pisang ke roda musuh sebelum musuh dapat melakukan apa saja. Cenderung terjepit.
sumber
Bot Pemotong Thread
Hentikan semua utas musuh sebelum diisi dengan kode Anda.
sumber
Salin dan Tandai Sendiri
Bot ini menjalankan tiga utas. Thread D bergerak hingga berjalan ke musuh, lalu mencoba menyalin bendera ke dalamnya, lalu bergerak ke arah acak. Utas A menyalin benderanya sendiri di atas baris yang tidak penting dari kode bot. Thread B hanyalah sebuah penghitung. Variabel, bendera, dan baris kode yang digunakan oleh setiap utas sepenuhnya dikunci dalam 15 putaran pertama, dan bot menimpa hampir semua kode permulaannya dengan benderanya sendiri. Saya tidak berpikir itu mungkin untuk mengubah bot ini ke spanduk tim lain setelah giliran 15 tanpa bot serangan khusus tidak melakukan apa-apa selain menulis bendera untuk itu.
sumber
Move 0
bergerak ke utara, bukan ke depan.