Hunger Gaming - Eat or Die
Jika kamu tidak makan, kamu mati. Jika Anda makan, Anda hidup (sampai Anda mati). Kamu akan mati, jadi cobalah untuk mati terakhir.
Gambaran
Ada sebuah pulau yang dihuni kawanan binatang buas. Anda mengontrol sekelompok lima predator. Objek Anda adalah untuk menjaga paket Anda tetap hidup. Lakukan ini dengan memakan mangsa. Sebaliknya, mangsa cenderung lari dari pemangsa, dan mencoba bertahan dalam kawanan. Tentu saja, bungkusan Anda akan berada di bidang yang sama dengan bungkusan lainnya , sehingga pesaing akan mencoba memakannya sebelum Anda bisa. Jangan biarkan ini membuat Anda kecil hati, atau Anda akan kelaparan.
Cara bermain
Buat dan kirimkan program baris perintah untuk mengarahkan paket Anda. Ini akan menerima informasi status dari program kontrol pada STDIN, dan output perintah pada STDOUT. Formatnya diuraikan secara terperinci di bawah ini. Setiap program hanya akan dijalankan sekali dan harus tetap berjalan sampai tidak ada lagi anggota paket yang hidup. Anda perlu membaca input saat masuk, dan merespons dengan cepat. Ada batas waktu 200ms untuk setiap respons. Jika Anda belum menjawab, paket Anda tidak akan menerima instruksi baru untuk giliran saat ini.
Jika program Anda tidak dapat dijalankan oleh controller, itu tidak akan dianggap valid. Harap sertakan string baris perintah yang perlu saya gunakan untuk menjalankan kiriman Anda. Jika ada instruksi khusus (untuk mengatur kompiler, dll), harap sertakan. Jika saya tidak bisa membuatnya berfungsi, saya akan meminta bantuan Anda dalam komentar. Jika Anda tidak merespons, saya tidak akan dapat menerima kiriman Anda.
Turnamen akan diadakan pada sistem Linux 64bit. Ingatlah hal ini ketika memberikan arahan yang diperlukan.
Detail
Posisi dan arah setiap makhluk adalah dalam bentuk sepasang angka floating point presisi ganda (misalnya
double
) yang mewakili masing-masingx
dany
koordinatnya.Setiap makhluk dianggap titik. Ini berarti mereka dapat tumpang tindih dan menempati ruang yang sama. Anda tidak akan terbentur ke samping, dan tidak ada konsep tabrakan dengan makhluk lain.
Pulau ini berbentuk bujur sangkar, 500 unit di satu sisi. Jika Anda mencoba menjelajah melampaui batas itu, Anda akan dijepit ke tepian. Asalnya
{0,0}
di kiri atas, denganx
meningkatnya ke kanan dany
meningkat ke bawah. Sekali lagi, peta tidak terbungkus .Permainan dimulai dengan 1500 + (packCount * 50) hewan mangsa. Mereka akan dikumpulkan di tengah pulau, tetapi dengan cepat memutuskan untuk mulai bergerak.
Paket akan diatur dalam lingkaran dengan jarak yang sama di sekeliling perimeter. Pesanan paket dikocok, jadi jangan mengandalkan mulai di lokasi tertentu.
Hewan mangsa dapat melihat semua hewan lain dalam radius 30 unit. Mereka dapat bergerak maksimal 6,0 unit per putaran.
Predator dapat melihat semua hewan lain dalam radius 50 unit. Mereka dapat bergerak maksimal 6,1 unit per putaran. Ini berarti mereka dapat melihat mangsa sebelum terlihat dan (nyaris) berlari lebih cepat dari mereka.
Predator hidup dan mati sesuai dengan tingkat kelaparan mereka . Itu dimulai pada 1000 , dan berkurang satu setiap belokan. Jika, setelah bergerak, predator berada dalam 1 unit mangsa, ia akan memakannya secara otomatis. Ini menghilangkan mangsa dan mengatur rasa lapar predator ke 1000. Setiap predator hanya makan satu mangsa per giliran. Jika ada lebih dari satu dalam jangkauan, ia akan memakan yang mana satu loop sampai yang pertama (belum tentu yang terdekat). Seorang predator mati jika rasa laparnya mencapai nol.
Paket mulai dengan masing-masing lima anggota . Setiap 5.000 putaran, semua paket yang masih dalam game akan menelurkan satu anggota baru. Ini akan ditempatkan dalam jangkauan yang terlihat dari sesama anggota paket. Pastikan entri Anda dapat menangani lebih dari lima anggota.
Setiap 1000 putaran, lebih banyak mangsa yang akan muncul. Jumlah mangsa baru akan menjadi jumlah predator hidup dikurangi satu.
Predator tidak dapat menyerang predator lainnya. Mereka memakan mangsa saat mereka menangkapnya. Itu dia.
Urutan dalam belokan adalah:
- Semua mangsa membuat keputusan
- Semua predator membuat keputusan
- Semua mangsa bergerak
- Semua pemangsa bergerak / makan
Urutan setiap paket untuk membuat keputusan / perpindahan mereka akan diacak pada setiap belokan.
Protokol (Umum)
Semua komunikasi dilakukan dalam format string US-ASCII
. Angka dikonversi ke string menggunakan Java Double.toString()
atau Integer.toString()
. Output Anda harus diformat sehingga dapat dibaca oleh Java Double.valueOf(String)
(Anda tidak akan menghasilkan bilangan bulat). Untuk detail tentang format yang dapat diuraikan, lihat dokumentasi untukDouble
. Semua bidang pada baris dipisahkan oleh \t
karakter standar , dan baris baru \n
. Seluruh string akan diakhiri dengan null byte \0
.
Dalam contoh di bawah ini, saya menggunakan <>
untuk menandai bidang demi keterbacaan. Ini tidak hadir dalam string yang sebenarnya.
Protokol (Input)
Panjang string input bervariasi, tergantung pada berapa banyak makhluk yang terlihat oleh paket Anda. Itu bisa melebihi 100 ribu karakter, jadi bersiaplah untuk itu. Pengaturan dasar adalah:
Baris 0: Informasi dasar tentang permainan.
turn
adalah nomor belokan saat ini, dan jumlah adalah jumlah total mangsa dan predator yang tersisa di lapangan. Iniinteger
dalam bentuk string.<turn>\t<preyCount>\t<predatorCount>\n
Baris 1: Id unik dan tingkat kelaparan anggota pack Anda. Ini tidak diberikan dalam urutan yang sama untuk setiap input. Gunakan id unik untuk melacak masing-masing anggota, bukan urutan kemunculannya di input. Sekali lagi, ini adalah
integer
string. Untuk satu pak dua, ini akan menjadi:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
Baris 2: Posisi anggota pack Anda, dalam urutan yang sama seperti yang diberikan pada baris 1 . Ini
double
sebagai string:<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
Baris berikut adalah visibilitas setiap anggota paket, dalam urutan yang sama seperti yang diberikan pada baris 1 . Ini akan diberikan sebagai dua baris per anggota.
Yang pertama untuk masing-masing terdiri dari lokasi untuk mangsa yang bisa dia lihat. Yang kedua adalah lokasi untuk predator yang bisa dia lihat. Lokasi-lokasi ini tidak unik secara keseluruhan. Misalnya, jika dua anggota paket dapat melihat hewan yang sama, itu akan berada di string kedua anggota. Juga, anggota paket Anda sendiri akan disertakan. Jika Anda ingin mengecualikan mereka, Anda mungkin ingin membandingkan lokasi dengan anggota Anda sendiri. Semua lokasi dalam double
format string.
Untuk setiap anggota yang masih hidup:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
Akhirnya, karakter terakhir adalah \0
, di awal baris berikutnya.
Pengecualian: Jika Anda menerima input dead\0
, paket Anda sudah mati. Akhiri program Anda dengan anggun. Pengontrol harus mematikan semua proses hidup ketika ditutup, tetapi saya lebih suka tidak memiliki proses zombie di semua tempat. Sebagai rasa hormat, Anda dapat memasukkan batas waktu input. Sebagai contoh, kelas contoh saya berakhir jika tidak menerima input selama 15 detik.
Protokol (Keluaran)
Outputnya sederhana. Anda akan memberikan sepasang double
nilai untuk setiap anggota paket langsung. Ini mewakili gerakan yang Anda ingin mereka lakukan pada giliran ini. Misalnya, jika makhluk Anda saat ini di {100.0, 100.0}
dan Anda memberi mereka perintah {-1.0, 1.0}
, mereka akan pindah ke {99.0, 101.0}
. Semua angka akan berada pada satu baris, dipisahkan oleh tab.
Misalnya, jika Anda memiliki 3 anggota pack hidup, ini akan menjadi respons yang valid:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
Hal ini akan memindahkan makhluk Anda dengan {1.0,-1.0}
, {2.0,-2.0}
, dan {3.0,-3.0}
. Urutannya sama dengan yang diterima dalam input. Jangan lupa bagian akhirnya \0
!
Jika Anda memberikan input yang tidak valid, hasil yang buruk akan mengikuti. Jika salah satu nomor tidak dapat diuraikan menjadi double
, itu akan menjadi nol. Jika string secara keseluruhan tidak dapat diuraikan, tidak ada instruksi baru yang akan diberikan, dan seluruh paket Anda akan menggunakan petunjuk dari giliran sebelumnya.
Semua arah akan dijepit ke jarak maksimum 6,1 unit. Anda bisa bergerak lebih lambat dari ini jika mau. Misalnya, {1, 0}
akan memindahkan Anda satu unit. {6,8}
(jarak 10) hanya akan menggerakkan Anda 6,1 unit, dan akan berkurang menjadi sekitar {3.66, 4.88}
. Arahnya tetap konstan.
Penting: Program kontrol membaca STDOUT dan STDERR Anda. Jika Anda melempar pengecualian dan mencetak ke STDERR, sangat kecil kemungkinannya bahwa pesan akan berbentuk respons yang valid. Cobalah untuk menghindari melakukan ini.
Program Kontrol / Pengujian
Sumber untuk controller dapat ditemukan di sini di bitbucket.org . Anda harus mengompilasinya sebelum dijalankan. Kelas utamanya adalah Game
, dan semua kelas ada dalam paket default. Untuk menjalankan, masukkan perintah setiap paket sebagai argumen terpisah. Misalnya, jika Anda ingin menjalankan Java ChaserPack dan Python LazyPack.py, Anda bisa menggunakan:
java Game "java ChaserPack" "python LazyPack.py"
Pada peta, mangsa muncul berwarna hijau, dan predator berwarna merah. Namun, paket mana pun yang merupakan paket pertama yang diberikan sebagai argumen akan berwarna biru. Ini dimaksudkan untuk membedakan mereka lebih mudah untuk tujuan pengujian. Predator juga akan berkedip putih selama lima frame saat mereka makan.
Permainan akan berlanjut hingga predator terakhir kelaparan, menulis ke konsol saat kelaparan atau peristiwa kepunahan terjadi. Setelah permainan selesai, skor akan diberikan untuk setiap paket. Jika Anda ingin tidak ingin melihat peristiwa kelaparan / kepunahan, Anda dapat menggunakan -silent
argumen. Maka itu hanya akan menghasilkan skor akhir. Anda harus melewati ini sebagai argumen pertama :
java Game -silent "java ChaserCat" "./someOtherPack"
Termasuk adalah paket kerangka Java bernama GenericPack
. Ini mencakup operasi input / output dasar yang diperlukan. Itu ada untuk memberikan contoh yang jelas tentang bagaimana mengurai dan membalas. Jika Anda ingin menambahkan templat dalam bahasa lain, beri tahu saya.
Juga termasuk predator berdasarkan pada templat ChaserPack
,. Itu tidak akan dimasukkan dalam turnamen, dan hanya disertakan untuk tujuan pengujian. Performanya cukup buruk, karena cacat penargetan yang disengaja. Jika Anda tidak bisa mengalahkannya, teruslah berusaha.
Di bawah ini adalah contoh menjalankan program kontrol (klik untuk video). Kualitas videonya tidak bagus (maaf), tetapi Anda bisa merasakan bagaimana mangsanya bergerak. ( hati-hati: audio )
Mencetak gol
Pemenang akan ditentukan oleh turnamen, mendapatkan poin di setiap putaran.
Setiap putaran berlangsung sampai semua predator mati. Setiap paket akan dinilai berdasarkan kapan anggota terakhirnya meninggal karena kelaparan. Mereka kemudian akan diberi poin berdasarkan pesanan. Poin akan terakumulasi selama sepuluh putaran, dan pemenangnya adalah paket dengan poin total tertinggi.
Tempat pertama untuk setiap putaran akan menerima 100 poin. Untuk setiap tempat setelah itu, hadiah akan dikurangi sebesar 20% (dibulatkan ke bawah). Ini akan berlanjut sampai poin mencapai nol (setelah tempat ke-17). Places 18+ tidak akan menerima poin untuk putaran ini. Paket yang mengikat akan menerima poin yang sama. Sebagai contoh:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
Poin maksimum yang mungkin selama turnamen adalah 1000, dari tempat pertama sebanyak sepuluh kali.
Jika beberapa program mengakhiri turnamen terikat untuk tempat pertama, turnamen sepuluh putaran lain akan diadakan dengan hanya entri tempat pertama yang diajukan. Ini akan berlanjut sampai satu pemenang muncul.
Saya akan mencoba menjalankan turnamen kira-kira setiap minggu, atau ketika kiriman baru masuk.
Aturan Tambahan (bermain adil!)
Anda tidak boleh membaca atau menulis ke sumber daya eksternal apa pun. Karena Anda tidak akan menjalankan program Anda beberapa kali, informasi status apa pun dapat disimpan secara internal.
Jangan mengganggu proses / pengajuan lainnya. Ini tidak berarti jangan mencoba mencuri mangsa mereka, berlari lebih cepat dari mereka, dll. Itu berarti jangan mengganggu jalannya proses. Ini adalah kebijaksanaan saya.
Kontestan dibatasi hingga maksimal tiga entri. Jika Anda mengirim lebih banyak, saya hanya akan mencetak tiga yang pertama dikirimkan. Jika Anda ingin mencabut satu, hapus itu.
Entri mungkin tidak ada hanya untuk menopang entri lain. Masing-masing harus bermain untuk menang karena kemampuannya sendiri.
Program Anda dapat menghasilkan maksimum satu proses anak pada satu waktu ( total keturunan, tidak langsung). Either way, pastikan Anda tidak melewati batas waktu. Anda tidak boleh memanggil
Game
kelas itu sendiri dengan cara apa pun.
Hasil - 29 April 2014
Inilah hasil turnamen sepuluh ronde terbaru:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
Paket yang dikirimkan sebelum 09:00 EDT 2014/04/29 termasuk dalam paket ini.
Anda juga dapat melihat detail untuk setiap putaran . Untuk beberapa alasan saya memutuskan untuk menghitung putaran ke belakang, jadi itu dimulai dengan "putaran 10".
Pembaruan
2014/04/23: FGreg melaporkan bug terkait timeout (terima kasih!). Perbaikan telah dilaksanakan, sehingga penguji ingin memperbarui kode program kontrol mereka.