Anda adalah gumpalan lendir. Tentu saja, menjadi lendir, Anda ingin merembes ke area sebanyak mungkin. Tetapi ada 3 slime lain yang ingin melakukan hal yang sama persis. Siapa yang akan menjadi lendir superior?
Deskripsi
Semua slimes akan dikumpulkan menjadi satu arena. Para juri (yaitu program kontrol) akan melalui daftar lengkap dari semua kemungkinan kombinasi 4-slime, menempatkannya di sudut-sudut sebuah tabel, dan mengamati untuk melihat slime mana yang mengalir keluar di sebagian besar area.
Lendir Anda dapat melakukan salah satu dari 3 tindakan setiap belokan: menyebar, melompat, atau menggabungkan. Deskripsi lebih lanjut tentang apa artinya ini akan diberikan di bagian Output .
Dewan / Arena
Arena akan menjadi papan persegi (saat ini 8x8, tetapi ini mungkin berubah di masa depan). Berikut adalah contoh arena permainan yang sedang berlangsung:
11111222
11111444
11.22444
.1222.4.
333.3244
33333.44
333...44
333....4
Slime diwakili oleh angka 1 hingga 4 (pemain 1 hingga 4), dan ruang kosong diwakili oleh sebuah titik ( .
). Awalnya, papan dimulai sebagai semua ruang kosong kecuali untuk satu unit lendir pemain 1 di sudut kiri atas, pemain 2 di kanan atas, pemain 3 di kiri bawah, dan pemain 4 di kanan bawah.
Koordinat diwakili oleh indeks baris dan kolom berbasis 0, agar mudah dibaca dalam kode. Misalnya, koordinat (3, 6) mewakili kuadrat ke-7 di baris ke-4 (dalam contoh di atas, a 4
). (Ini membuatnya lebih mudah untuk mengakses kotak:. board[coords.x][coords.y]
) Berikut adalah ilustrasi visual:
(0, 0) (0, 1) (0, 2)
(1, 0) (1, 1) (1, 2)
(2, 0) (2, 1) (2, 2)
Memasukkan
Input program Anda akan menjadi pemain mana Anda (1, 2, 3, atau 4), koma ( ,
), kemudian konten papan / arena (dengan baris baru diganti dengan koma). Misalnya, jika Anda adalah pemain 3 dalam skenario di atas, input Anda adalah:
3,11111222,11111444,11.22444,.1222.4.,333.3244,33333.44,333...44,333....4
Keluaran
Program Anda harus menghasilkan 4 bilangan bulat. Dua yang pertama adalah indeks baris dan kolom masing-masing dari lendir yang ingin Anda pindahkan, dan dua berikutnya adalah indeks baris dan kolom di mana Anda ingin memindahkannya.
Ada tiga pilihan yang Anda miliki di setiap belokan: Sebarkan, lompat, atau gabungkan.
Penyebaran
Untuk menyebar, koordinat target harus tepat satu kotak dari lendir yang dipindahkan, dan kotak pada koordinat target harus berupa ruang kosong. Saat menyebar, slime baru dibuat pada koordinat target dan slime lama tidak dihilangkan. Setelah lendir baru dibuat, semua lendir musuh dalam 8 kotak di sekitar lendir baru ini dikonversi menjadi pemain yang bergerak.
Sebagai contoh, dengan papan di Gambar. 1, jika pemain 1 adalah output
0 1 1 2
, hasilnya akan menjadi papan di Gambar. 2.1. 2. 11.22 11.12 1..22 1.112 ..22. ..11. ..... .....
Melompat
Untuk melompat, koordinat target harus tepat dua kotak dari lendir yang dipindahkan, dan bujur sangkar pada koordinat target harus berupa ruang kosong. Saat jupming, lendir baru dibuat pada koordinat target dan lendir lama dihilangkan. Setelah lendir baru dibuat, semua lendir musuh dalam 8 kotak di sekitar lendir baru ini dikonversi menjadi pemain yang bergerak.
Sebagai contoh, dengan papan di Gambar. 1, jika pemain 1 adalah output
0 1 2 3
, hasilnya akan menjadi papan di Gambar. 2.1. 2. 11..2 1...2 1...2 1...1 ....2 ...11 ...22 ...11
Menggabungkan
Untuk bergabung, koordinat target harus tepat satu kotak dari lendir yang dipindahkan, dan kotak di koordinat target harus lendir pemain yang sama. Saat penggabungan, lendir lama dihilangkan. Kemudian, semua ruang kosong dalam 8 kotak di sekitar slime target dikonversi ke pemain yang dipindahkan (tidak termasuk slime lama yang dipindahkan).
Sebagai contoh, dengan papan di Gambar. 1, jika pemain 1 adalah output
0 1 1 2
, hasilnya akan menjadi papan di Gambar. 2.1. 2. 11..2 1.112 1.1.2 11112 ....2 .1112 ..222 ..222
Anda juga dapat lulus, hanya dengan mengeluarkan koordinat yang tidak valid (mis. 0 0 0 0
).
Aturan dan batasan
Aturan tambahan adalah:
- Anda dapat membaca dan menulis file di dalam folder Anda sendiri untuk menyimpan data (pengiriman akan disimpan
players/YourBotName/yourBotName.language
), tetapi Anda tidak boleh memodifikasi atau mengakses hal lain di luarnya. Akses internet dilarang. - Kiriman Anda mungkin tidak diberi kode khusus untuk membantu atau melukai kiriman lainnya. (Anda mungkin memiliki banyak kiriman, tetapi mereka tidak boleh secara khusus berinteraksi satu sama lain dengan cara apa pun.)
- Kiriman Anda harus tidak lebih dari 0,1 detik per belokan. Jika kiriman Anda kadang-kadang membutuhkan waktu 0,105 detik, itu tidak masalah, tetapi mungkin tidak secara konsisten memakan waktu lebih lama dari batas waktu ini. (Ini terutama pemeriksaan kewarasan untuk menghindari pengujian yang memakan waktu terlalu lama.)
- Kiriman Anda tidak boleh merupakan duplikat yang tepat (yaitu menggunakan logika yang sama persis) dari yang lain, bahkan jika itu dalam bahasa yang berbeda.
- Kiriman Anda harus kiriman serius. Ini berdasarkan pendapat, tetapi jika kiriman Anda jelas tidak berusaha menyelesaikan tantangan (mis. Jika Anda melewati setiap belokan), itu akan didiskualifikasi.
Jika kiriman Anda melanggar salah satu dari aturan ini atau tidak mengikuti spesifikasi, itu akan didiskualifikasi, dihapus dari playerlist.txt
, dan game akan dimulai ulang dari awal. Jika kiriman Anda didiskualifikasi, saya akan meninggalkan komentar pada kiriman Anda yang menjelaskan alasannya. Jika tidak, kiriman Anda akan ditambahkan ke papan peringkat. (Jika Anda tidak melihat kiriman Anda di papan peringkat, tidak memiliki komentar yang jelas tentang kiriman Anda, dan memposting kiriman Anda sebelum waktu "Pembaruan terakhir" di bawah, tolong beri tahu saya! Saya mungkin secara tidak sengaja mengabaikannya.)
Dalam entri Anda, harap sertakan:
- Sebuah nama.
- Sebuah perintah shell untuk menjalankan program Anda (misalnya,
java MyBot.java
,ruby MyBot.rb
,python3 MyBot.py
, dll).- Perhatikan bahwa input (pemain dan peta Anda) akan ditambahkan ke ini sebagai argumen baris perintah.
- Program akan diuji pada Ubuntu 14.04, jadi pastikan kode Anda dapat dijalankan (secara bebas) di atasnya.
- Nomor versi, jika kode Anda bekerja secara berbeda pada versi bahasa Anda yang berbeda.
- Kode bot Anda.
- Petunjuk tentang cara menyusun kode, jika perlu.
Kode pengontrol / pengujian, contoh bot
Kode pengontrol ditulis dalam C ++, dan dapat ditemukan di Github . Instruksi lebih lanjut tentang cara menjalankan dan menguji kode Anda dapat ditemukan di sana.
simplebot.rb
, bot yang sangat sederhana yang menyebar atau melompati lendir acak ke lokasi acak setiap belokan, juga dipasang di Github .
Penilaian dan papan peringkat
Ketika semua kotak di papan diisi, permainan berakhir dan skor dihitung. Skor akhir seorang pemain adalah jumlah kotak yang berisi lendir mereka di akhir pertandingan. Jika 2000 giliran telah berlalu (500 untuk setiap pemain) dan permainan masih belum berakhir, permainan akan tetap berakhir dan skor akan dilaporkan seolah-olah permainan telah berakhir.
Di akhir turnamen, skor dari semua pertandingan akan dirata-rata untuk menghitung skor akhir masing-masing pemain, yang akan diposting di papan peringkat. Tidak ada batas waktu pengiriman; Saya akan terus memperbarui leaderboard secara berkala saat kiriman baru masuk.
4 pengajuan diperlukan sampai leaderboard nyata muncul.
+--------------------------+-----------+--------------------+
| Name | Avg Score | Last Updated (UTC) |
+--------------------------+-----------+--------------------+
| GreedySlime | 47.000 | Jul 22 10:27 PM |
| Jumper | 12.000 | Jul 22 10:27 PM |
| ShallowBlue | 5.000 | Jul 22 10:27 PM |
| Lichen | 0.000 | Jul 22 10:27 PM |
+--------------------------+-----------+--------------------+
Terakhir diperbarui: 22 Jul 22:27 (UTC).
sumber
Jawaban:
GreedySlime
Cukup lakukan langkah yang menghasilkan keuntungan bersih terbesar dari unit lendir.
Perhatikan bahwa ini ditulis dalam Python 2.x .
Contoh dijalankan (menggunakan contoh yang diberikan dalam deskripsi tantangan, dan dengan asumsi kode disimpan dalam file bernama
slime.py
):sumber
Biru Dangkal
Dangkal biru mencoba mencari tahu apa yang mungkin terjadi di masa depan dengan melakukan pencarian pohon yang
lengkapdari langkah yang mungkin, sayangnya, ia tidak mendapatkan lebih jauh dari giliran berikutnya. Dia kemudian menampar beberapa skor setengah-setengah pada setiap kemungkinan keadaan papan setelah giliran berikutnya, menghitung skor untuk setiap cabang individu dengan formula yang sama-sama konyol dan: voila langkah yang ideal dikenal!EDIT: Kode asli berjalan terlalu lambat jadi saya memodifikasinya sehingga hanya mengambil sampel acak dari semua kemungkinan gerakan. Ini akan mencoba hampir semua gerakan ketika ada sedikit gerakan yang mungkin dan persentase yang lebih kecil ketika ada lebih banyak gerakan yang mungkin.
sumber
Peloncat
Suka melompat, terlebih lagi ke tengah.
Akan berlalu jika tidak ada lendir yang bisa melompat.
C ++ , Harus dikompilasi hanya dengan
g++ jumper.cpp -o jumper
Saya mencuri verifikasi langkah Anda, maaf. Juga saya menyerah pada praktik pengkodean yang benar tepat setelah saya mulai, jadi jangan lihat. Namun, tampaknya berjalan pada berbagai ukuran papan.
sumber
DeathSlime :
Deskripsi : Mencoba memburu musuh yang paling lemah dan menghancurkannya. Ulang.
Cara menjalankan : ruby DeathSlime.rb
Versi Ruby : 2.1.2
sumber
Lumut
Ini adalah bot yang ditulis dalam R. Itu perlu dipicu menggunakan
Rscript Lichen.R
.Algoritma yang dimaksud adalah bahwa ia mencoba untuk menutupi area persegi panjang (mengisi kosong menggunakan
spread
). Ketika persegi panjang selesai, itumerges
dua slimes di salah satu sudutnya (yang paling jauh dari sudut papan) untuk memperluas area "layak huni", kemudian mengisi persegi panjang yang baru ditetapkan, dll. Tidak digunakanjump
.Jika musuh berada di area yang bisa dihuni dan ada ruang kosong juga di area itu, itu mengisi ruang kosong di sebelahnya. Jika lendir yang seharusnya digabung menjadi ketika memperluas area yang dapat dihuni dikelilingi oleh musuh, maka satu lendir akan
spread
menggantikan penggabungan ini.sumber
0 0 0 0
ketika tidak ada lendir yang tersisa di papan.CornerSlime
Lendir ini memiliki gagasan tentang sudut, atau setidaknya ketika saya pertama kali menulisnya dalam C #, saya tidak benar-benar yakin lagi.
Ditulis dalam C ++, mungkin akan dikompilasi dengan gcc dan hampir tidak ada argumen; semoga saya tidak menggunakan apapun MSVC khusus secara tidak sengaja.
Diuji secara eksklusif terhadap dirinya sendiri pada server yang dimodifikasi (tidak ada kompiler C ++ baru yang mewah di mana saya berada) jadi saya tidak tahu bagaimana kinerjanya, mudah-mudahan itu tidak akan didiskualifikasi karena terlalu lambat. Saat ini tidak ada keacakan dalam bot ini, tetapi saya dapat menambahkan beberapa di kemudian hari.
Ini adalah C # porting ke C ++ (karena masalah kecepatan) oleh seseorang yang tidak benar-benar tahu C ++, dan sangat menghebohkan. Dimulai dengan membangun array Sel, yang kemudian diisi dengan segala macam informasi yang tidak membantu tentang sel di sekitarnya (jumlah sel saya, jumlah slime saya, hal semacam itu). Kemudian ia menggunakan informasi ini untuk memutuskan apakah perlu melihat lebih dekat pada informasi yang digunakannya untuk membuat informasi itu, dan kemudian berpotensi menggunakan informasi tersebut untuk menghasilkan keluaran yang bermakna.
sumber