Perburuan Telur Paskah
Bot menemukan telur sebelum kelinci menemukan telur. Bot senang.
Gambaran
Ini adalah tantangan raja untuk menghormati Paskah dan tradisi berburu telur Paskah!
Bot Anda memiliki visi dua ruang di setiap arah, termasuk diagonal, menciptakan kotak 5x5 di sekitar Anda yang dapat Anda lihat. Ia mencari telur, dan siapa pun yang menemukan telur terbanyak akan menang!
Papan
Papan akan terdiri dari o
s, yang merupakan telur Paskah, #
s, yang merupakan dinding, *
s, yang merupakan pemain lain, dan s, yang merupakan ruang kosong.
- Itu akan menjadi persegi dengan panjang tepi
(number of entries) * 3
. - Itu akan dikelilingi oleh dinding.
- Di dalam dinding akan ada bermacam-macam dinding garis lurus yang ditempatkan secara acak
#
, yang akan memiliki panjang acak antara 2 dan 10 inklusif. Akan ada(number of entries) * 3
dari mereka. - Telur-telur itu kemudian akan ditempatkan secara acak. Akan ada
(number of entries) * 4
dari mereka, dan mereka hanya akan dihasilkan padakotak kosong ( ).
- Harus ada setidaknya 7 entires agar proses pembuatan papan berfungsi dengan benar.
Berikut ini adalah JSFiddle yang akan menghasilkan papan acak untuk Anda uji. Ini sebuah contoh, dengan (number of entries) = 7
:
#####################
# o ##
# # o ##
# #o ###### ##
###### # ##
## o # # ##
## o# #o# o o##
## #o # # o # #
## # o # # # #
## ## # # o # #
## # # o # # #
## # o # ## # # #
## # # # #
# o # ## # #
# o oo ##o #
#o ####### oo ## #
# # # #
# o o o# #
# o #### o o#
# #
#####################
Setelah papan dibuat, setiap pemain ditempatkan pada kotak acak (ruang kosong).
Memasukkan
Anda akan mengambil enam baris input. Lima baris pertama adalah bidang penglihatan Anda (ruang di luar batas papan akan diwakili oleh X
, dan ruang tengah akan selalu *
, Anda), dan baris keenam akan kosong (pada awalnya).
Keluaran
Anda akan menghasilkan tiga baris. Pertama, arah yang Anda inginkan:
1 2 3
8 YOU 4
7 6 5
(9 adalah no-op jika Anda tidak ingin pindah), kedua, salah satu taktik A
, C
ounter, atau N
othing (ini akan dijelaskan secara mendalam segera), dan baris ketiga akan menjadi string dengan panjang hingga 1024 Ini akan menjadi memori bot Anda. Anda dapat menggunakannya untuk apa pun yang Anda inginkan, atau Anda dapat membiarkannya kosong. Memori ini kemudian akan menjadi baris input keenam untuk program Anda pada proses selanjutnya.
Semua jalur keluaran selanjutnya diabaikan, dan jika hanya ada satu jalur, yang kedua diasumsikan kosong.
Bergerak
Proses berikut digunakan untuk menentukan ke mana Anda pindah:
- Jika, ketika Anda bergerak, Anda berakhir di ruang kosong (
), pemain Anda ditempatkan di ruang itu.
- Jika Anda berakhir di dinding (
#
), gerakan Anda diabaikan dan Anda kehilangan giliran. - Jika Anda berakhir dengan telur (
o
) atau pemain (*
), informasi ini disimpan dan akan digunakan setelah semua orang pindah.
Setelah semua orang pindah, ambiguitas teratasi.
Jika ada dua pemain yang mendarat di ruang yang sama, perkelahian terjadi! Di sinilah A
/ C
/ N
masuk untuk bermain. Serangan A
ketukan N
othing (serangan normal), N
othing ketukan C
ounter (Anda tidak dapat melawan apa-apa), dan C
ounter mengalahkan detak A
(serangan balik). Pemain yang memenangkan pertarungan ini tetap berada di kotak mereka, dan pemain yang kalah akan kembali ke kotak awal yang mereka mulai. Jika terjadi seri, kedua pemain kembali ke posisi semula.
Jika pemain yang kalah atau terikat kembali ke tempat mereka berada dan ada pemain lain di sana, tidak ada pertarungan dan pemain lain juga akan kembali ke ruang asalnya. Jika ini ruang memiliki pemain lain, bahwa pemain kembali, dan ini terus sampai semua pemain berada dalam ruang yang berbeda.
Jika ada tiga atau lebih pemain dalam satu ruang, mereka semua kembali ke posisi semula.
Jika ada pemain yang masih berdiri di atas telur ...
- Jika pemain memilih
A
, telur dihancurkan. - Jika pemain memilih
C
, tidak ada yang terjadi dan pemain kembali ke ruang aslinya. - Jika pemain memilih
N
, pemain mengambil telur! Skor pemain bertambah satu dan telur dikeluarkan.
Bahasa
Anda dapat menggunakan bahasa apa pun yang tersedia secara bebas di Windows, OSX, dan Linux, untuk memastikan keadilan di antara setiap kontestan. Jika kode ini tidak dapat dijalankan secara bebas tetapi dapat dikompilasi atau dikemas ke dalam format yang ada, harap sertakan juga format ini dalam jawaban Anda. Idealnya, jika Anda dapat mengkompilasi kode Anda ke bahasa yang lebih umum (mis. CoffeeScript -> JavaScript), silakan lakukan.
Mencetak gol
Skor Anda akan menjadi jumlah rata-rata telur yang Anda kumpulkan dari sepuluh run. Berlari berakhir ketika semua telur dikumpulkan atau ketika (number of entries * 25)
belokan telah lewat. Saya akan secara manual memastikan bahwa mungkin untuk mencapai semua telur untuk setiap peta (dengan terus menghasilkan peta sampai semua telur dapat dijangkau).
Papan angka
Papan skor akan ditambahkan ketika semua kondisi berikut dipenuhi:
- Setidaknya tujuh entri yang valid dengan skor positif atau nol (tidak diturunkan) telah dikirimkan
- Setidaknya 48 jam telah berlalu sejak penciptaan tantangan ini (UTC 14:23)
Aturan tidak akan berubah selama periode pra-kontes ini, kecuali untuk menambahkan klarifikasi di mana aturan tidak jelas. Setelah papan skor dipasang, program pengujian juga akan diposting di sini sehingga Anda dapat menguji entri Anda. Kode pengujian untuk ini masih dalam proses, tetapi dapat dimainkan dan berfungsi. Ini repo GitHub.
sumber
9
, ia tidak akan pernah bisa diserang secara berarti. Jika pemain lain (B) melangkah ke kotak pemain itu dan menang, A akan dipindahkan kembali ke kotak aslinya (yang sama). Tapi sekarang ada bentrokan karena A dan B ada di sana, jadi B harus kembali ke alun-alun sendiri. Jadi hasilnya tidak tergantung pada pertarungan yang sebenarnya, B selalu bergerak kembali ke awal kuadrat dan A selalu bertahan. Itu akan memungkinkan saya untuk menulis keduanya yang dapat membantu pengiriman lain dengan memblokir jalan bagi orang lain.Jawaban:
Cart'o'Gophers
Ini adalah pengajuan lain - dan ini sebenarnya dimaksudkan untuk menjadi kompetitif. Sekali lagi, ada di Ruby. Jadi jalankan dengan
ruby cartogophers.rb
. Ini memakan waktu lebih lama dari yang diharapkan ...Bot ini mengingat apa yang dilihatnya sebelumnya dan mencoba membuat peta yang lebih besar di setiap belokan. Kemudian menggunakan pencarian luas pertama untuk telur terdekat dan kepala seperti itu. Jika tidak ada telur yang bisa dijangkau di peta saat ini, bot mengarah ke tepi terbuka terdekat dari peta (sehingga untuk memperluas peta dengan cepat ke arah itu masih bisa bergerak).
Bot ini belum memiliki konsep bot lain dan juga tidak memiliki strategi bertarung. Karena saya belum menemukan cara yang dapat diandalkan untuk menentukan apakah langkah saya berhasil, ini dapat menyebabkan beberapa masalah. Saya hanya selalu berasumsi bahwa langkah itu berhasil - jadi jika bukan tambalan baru akan dimuat ke peta di tempat yang salah, yang mungkin atau mungkin tidak berbahaya untuk merintis jalan.
Bot menggunakan memori untuk menyimpan peta dan posisi barunya di peta (dengan asumsi langkah akan berhasil). Peta disimpan tanpa jeda baris, zip dan base64 disandikan (bersama dengan jumlah baris peta, sehingga jeda baris dapat dimasukkan kembali). Kompresi ini membawa ukurannya menjadi sekitar sepertiga dari peta yang tidak terkompresi, sehingga memiliki keteduhan lebih dari 1000 byte, saya bisa menyimpan peta sekitar 3000 sel, yang kira-kira sama dengan menjelajahi sepenuhnya peta dengan 18 bot. Selama ada banyak pengajuan yang dekat, saya tidak berpikir saya bisa repot-repot mencari tahu untuk memperbaiki kasus itu.
Setelah beberapa tes berjalan terhadap 5dumbbot
dan 1naivebot
(pengajuan saya yang lain), itu dilakukan dengan sangat buruk (seperti 1 atau 2 telur) atau mengungguli yang lain dengan selisih yang cukup besar (7 hingga 9 telur). Saya mungkin berpikir tentang strategi pertempuran yang lebih baik dan bagaimana saya bisa menentukan apakah saya benar-benar bergerak atau tidak. Keduanya mungkin dapat sedikit meningkatkan skor.Oh dan jika Anda bertanya-tanya tentang nama bot, Anda harus membaca The Order of The Stick ( panel terakhir pada komik ini ).
EDIT: Ada beberapa bug dengan mendeteksi tepi peta yang ditemukan. Sekarang saya sudah memperbaikinya bot ini selalu mendapat skor sekitar
20
5dumbbot
s dan 1naivebot
. Itu lebih seperti itu! Jika Anda menambahkan$stderr.puts map
ke bot saya sekarang, Anda benar-benar dapat melihat bagaimana dia secara sistematis membuka peta dan mengumpulkan semua telur untuk sementara waktu. Saya juga memutuskan untuk memilihA
daripadaN
setiap kali tidak melangkah ke telur, untuk mengurangi kemungkinan pindah kembali ke sel asli bot (yang sebagian mengacaukan peta).(Ini tidak berkinerja baik melawan 6
naivebot
s, terutama karena sangat mungkin berakhir di "jalan buntu" dengan bot lain ketika mereka berdua berulang kali ingin mengambil telur dan memilihN
. Saya perlu memikirkan itu ... )sumber
Kelinci Jawa
Kelinci ini belum selesai tumbuh (saya masih berencana untuk melakukan perubahan), tetapi ini adalah titik awal untuk saat ini. Dia mencari telur terdekat dan menuju ke sana. Belum ada deteksi dinding atau deteksi di luar batas. Dia akan pergi untuk mengambil telur yang dia tuju, tetapi jika tidak dia akan mencoba mendorongnya dan menyerang yang lain. Jika tidak ada telur di dekatnya, ia akan mulai mengikuti kelinci terdekat. Mereka mungkin tahu sesuatu yang tidak dia ketahui. Kalau tidak, dia hanya akan memilih arah acak untuk berjalan. Dan dia cukup pelupa (tidak menggunakan variabel memori).
Paket bergerak maju:
Perbarui 1 Kelinci saya akan mengikuti kelinci lain jika dia tidak melihat telur. Juga refactored kode "cari telur terdekat" ke dalam metode itu sendiri.
sumber
N
aiveBot (dalam Ruby)Ini adalah bot yang sangat sederhana untuk mendapatkan telur bergulir (kami ingin menekan 7 kiriman cepat, kan?). Ruby saya tidak terlalu idiomatis sehingga kode ini bisa membuat rubyists merasa ngeri kesakitan. Baca dengan risiko Anda sendiri.
Jalankan dengan
ruby naivebot.rb
.Saya hanya meng-hardcoding beberapa kasus, di mana telur terlihat dan tidak terhalang oleh dinding. Itu bahkan tidak berlaku untuk telur terdekat, tetapi mengambil langkah pertama yang masuk akal. Jika tidak ada telur seperti itu ditemukan, bot membuat gerakan acak. Itu mengabaikan semua pemain lain dan tidak pernah menyerang atau melawan.
sumber
WallFolower
(permainan kata-kata yang disengaja) dalam Python 3 :
Bergerak ke telur jika ada telur yang terlihat, tetapi hanya jika lebih dekat ke telur itu daripada robot lain. Jika ada ikatan di kejauhan, itu berlaku untuk itu. Jika tidak, apakah dinding LH mengikuti (saat ini tidak diimplementasikan dengan baik).
Masih perlu bekerja di dinding ikuti, tapi saya akan memposting ini di sini.
sumber
sys.exit(0)
keexit(0)
? Juga, saya perlu mengerjakan ini (sekarang, ini menganggap dirinya adalah ``), tapi saya tidak punya waktu. Ketika saya punya waktu, saya akan datang dan memperbaikinya.