Dalam tantangan ini, Anda harus merancang spesies organisme bersel tunggal untuk bertarung sampai mati di arena cawan petri. Arena direpresentasikan sebagai kotak persegi panjang, di mana setiap sel menempati satu ruang:
.....x....
...x...o..
...x.c..o.
.......o..
Atribut
Setiap sel memiliki tiga atribut. Saat menentukan spesies sel Anda di awal permainan, Anda mengalokasikan 12 poin di antara atribut ini.
- Hit Points (HP): Jika HP sel jatuh ke nol, ia mati. Sel-sel baru memiliki HP penuh.
- Ketika sebuah sel mati, ia meninggalkan mayat yang bisa dimakan oleh sel-sel lain untuk energi.
- Sel tidak bisa mendapatkan kembali HP yang hilang, tetapi bisa membuat sel baru dengan HP penuh dengan membaginya.
- Energi : Sebagian besar tindakan yang dilakukan sel membutuhkan energi. Dengan beristirahat secara aktif, sel dapat memperoleh kembali energi yang hilang hingga maksimum spesiesnya.
- Spesies sel dengan energi kurang dari 5 cenderung gagal, karena tidak dapat membelah untuk membuat sel baru.
- Sel tidak bisa mendapatkan kembali energi di luar nilai maksimum spesiesnya.
- Sel yang baru dibuat memiliki nilai energi awal yang disalin dari induknya (dan nilai maksimum ditentukan oleh spesifikasi spesiesnya).
- Keasaman : Jika suatu sel memilih untuk meledak, tingkat keasaman sel digunakan dalam menghitung kerusakan sel-sel yang berdekatan.
Tindakan
Setiap belokan, setiap sel dapat mengambil satu tindakan:
Pindah: Sel bergerak satu ruang ke segala arah (N / S / E / W / NE / NW / SE / SW) dengan biaya 1 energi.
- Sel tidak bisa bergerak ke ruang yang ditempati sel hidup lain.
- Sel tidak bisa bergerak dari grid.
- Pindah ke mayat sel menghancurkan mayat.
Serangan: Sebuah sel menyerang sel yang berdekatan, menghasilkan 1 hingga 3 kerusakan, dengan mengeluarkan 1 hingga 3 poin energi.
- Sel dapat menyerang ke segala arah (N / S / E / W / NE / NW / SE / SW).
- Adalah legal untuk menyerang sel-sel yang bersahabat.
Membagi: Sel membelah dan menciptakan sel baru pada ruang yang berdekatan, dengan biaya 5 energi.
- Sebuah sel dapat membelah ke segala arah (N / S / E / W / NE / NW / SE / SW).
- Sel baru memiliki HP lengkap sesuai dengan spesifikasi sel asli Anda.
- Sel baru memiliki energi sebanyak yang dimiliki sel induknya setelah mengurangi biaya pembagian. (Misalnya, sel induk dengan 8 titik energi awal akan dikurangi menjadi 3 energi dan menghasilkan sel anak dengan 3 energi).
- Sel baru tidak dapat bertindak sampai giliran Anda berikutnya.
- Sel tidak dapat membelah menjadi ruang yang ditempati oleh sel hidup, tetapi dapat membelah menjadi ruang yang ditempati oleh mayat sel mati (ini menghancurkan mayat).
Makan: Sel memakan mayat sel yang berdekatan, mendapatkan 4 energi.
- Sel bisa makan ke segala arah (N / S / E / W / NE / NW / SE / SW).
Istirahat: Sel tidak melakukan apa-apa untuk satu putaran, mendapatkan kembali 2 energi.
Meledak: Ketika sebuah sel memiliki 3 atau lebih sedikit HP dan lebih banyak energi daripada HP, ia dapat memilih untuk meledak, memberikan kerusakan pada semua delapan sel yang berdekatan.
- Kerusakan pada setiap sel yang berdekatan adalah
(exploding cell HP) + (explodng cell acidity)
- Sel yang meledak mati dan meninggalkan mayat, seperti halnya sel yang terbunuh dalam ledakan.
- Kerusakan pada setiap sel yang berdekatan adalah
Protokol
Mendirikan
Program Anda akan berjalan dengan string yang BEGIN
disediakan di stdin. Program Anda harus menulis ke stdout daftar 3 bilangan bulat non-negatif yang dipisahkan oleh ruang, mewakili HP, energi, dan keasaman untuk spesies sel Anda: misalnya 5 6 1
,. Angka-angka harus berjumlah 12. Keasaman mungkin 0
, jika Anda inginkan. (Atribut lain mungkin juga nol, tetapi secara fungsional kehilangan permainan!)
Anda mulai dengan satu sel, di sudut barat laut atau tenggara, satu ruang dari kedua sisi. Sel awal memiliki HP dan energi penuh.
Setiap sel bertindak
Setiap belokan, program Anda akan dipanggil satu kali untuk setiap sel yang hidup di tim Anda (kecuali sel yang baru saja dibuat giliran ini) sehingga sel dapat bertindak. Program Anda dilengkapi dengan data tentang stdin yang mencakup status cawan petri dan informasi tentang sel khusus ini:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
Dua angka pertama menunjukkan lebar dan tinggi arena: di sini, ada arena 10-oleh-4.
- The
o
sel adalah milikmu; yangx
sel adalah musuh Anda. (Ini selalu benar; setiap pemain selalu melihat sel mereka sendirio
.) - The
.
ruang kosong. - The
c
ruang mewakili mayat sel dimakan.
Angka-angka setelah baris kosong mewakili info tentang sel ini:
- Dua angka pertama adalah
x,y
koordinat, diindeks dari0,0
di kiri atas (jadi di6 3
sini mengacu padao
sel paling selatan ). - Angka ketiga adalah HP sel; angka keempat adalah energi sel.
Program Anda harus menampilkan (untuk stdout) suatu tindakan. Pada contoh di bawah ini, kami akan menggunakan N
sebagai arahan contoh, tetapi bisa berupa arahan apa pun yang sah untuk tindakan tersebut ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ SW
). Semua keluaran program tidak peka huruf besar-kecil, tetapi contoh akan menggunakan huruf besar. Setiap tindakan keluaran yang tidak valid (baik karena memiliki sintaks yang tidak valid atau upaya tindakan ilegal) diabaikan dan menghasilkan sel REST
(dan dengan demikian mendapatkan 2 energi).
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- angka tersebut mewakili kekuatan serangan (1 - 3)REST
EXPLODE
Giliran tim Anda terdiri dari semua sel Anda diberi kesempatan untuk bertindak, satu per satu. Semua sel Anda bertindak sebelum sel lawan bertindak. Setelah semua sel Anda bertindak, giliran Anda berakhir, dan giliran lawan Anda dimulai. Setelah semua sel lawan Anda bertindak, giliran Anda mulai lagi. Dalam giliran Anda, setiap sel diberi prioritas untuk bertindak berdasarkan usianya: sel tertua di tim Anda bertindak terlebih dahulu sebelum sel yang lebih muda.
Contoh
Begini cara suatu program berperilaku. Input dari stdin dilambangkan di sini dengan >
panah utama (dipisahkan dari input aktual oleh ruang klarifikasi) dan output pada stdout memiliki <
panah.
> BEGIN
< 5 6 1
Kemudian, program dipanggil lagi:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
Setelah giliran lawan (yang memutuskan untuk DIVIDE W
menggunakan sel awal tunggal), program Anda dipanggil dua kali, satu kali untuk setiap sel:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
Untuk doa kedua giliran Anda:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
Perhatikan sel kedua ini melihat status papan yang diperbarui berdasarkan gerakan sel lain sebelumnya pada giliran Anda. Juga perhatikan sel ini telah dibuat dengan 1 energi, karena sel induk memiliki 6 energi ketika melakukan pembelahan terakhir (jadi yang asli 6, dikurangi biaya pembagian 5-energi, menciptakan sel anak dengan 1 energi).
Sekarang giliranmu selesai dan giliran lawanmu dimulai. Dua sel yang berlawanan akan diberi kesempatan untuk bertindak, dan kemudian giliran Anda berikutnya dimulai.
Kemenangan
Anda bisa menang dengan:
- Menghancurkan semua sel yang berlawanan, atau
- Memiliki lebih banyak sel daripada lawan Anda setelah setiap pemain menyelesaikan 150 putaran
Penilaian akan didasarkan pada jumlah kemenangan dalam 100 pertandingan melawan satu sama lain pengajuan. Dalam setengah dari simulasi, program Anda akan diizinkan untuk pergi dulu.
Permainan seri (yaitu jumlah sel yang sama persis setelah 150 putaran, atau satu-satunya sel yang tersisa terbunuh bersama dalam ledakan) tidak dihitung dalam total kemenangan salah satu pemain.
Informasi lainnya
- Program Anda seharusnya tidak berusaha mempertahankan status (melampaui penggunaan cawan Petri): organisme monoseluler tidak memiliki ingatan yang sangat baik dan bereaksi terhadap dunia saat demi saat. Secara khusus, menulis ke file (atau penyimpanan data lainnya), berkomunikasi dengan server jarak jauh, atau mengatur variabel lingkungan tidak diizinkan secara eksplisit.
- Kiriman akan dijalankan / dikompilasi di Ubuntu 12.04.4.
- Spesifik dari 100 game penilaian belum dikonfirmasi, tetapi mereka kemungkinan akan melibatkan beberapa ukuran arena (misalnya, 50 berjalan di arena kecil dan 50 berjalan di arena yang lebih besar). Untuk arena yang lebih besar, saya dapat menambah hitungan turn turn untuk memastikan bahwa pertarungan yang tepat dapat terjadi.
Sumber daya
Berikut adalah kode driver yang menjalankan simulasi, ditulis untuk Node.js, dipanggil oleh node petri.js 'first program' 'second program'
. Misalnya, mengadu sel yang ditulis Python dengan sel yang ditulis Java mungkin terlihat seperti node petri.js 'python some_cell.py' 'java SomeCellClass'
.
Selain itu, saya mengerti bahwa membaca dan menguraikan banyak baris pada stdin bisa sangat menyebalkan, jadi saya telah menyusun beberapa sel sampel lengkap dalam berbagai bahasa yang Anda bebas untuk membangun, sepenuhnya merombak, atau mengabaikan sepenuhnya.
- Sel jawa
- Sel python
- Sel JavaScript (untuk digunakan dengan Node.js)
Tentu saja Anda bebas menulis sel dalam bahasa yang berbeda; ini hanya tiga bahasa yang saya putuskan untuk menulis kode boilerplate sebagai bantuan hemat waktu.
Jika Anda memiliki masalah dalam menjalankan driver, silakan ping saya di ruang obrolan yang saya buat untuk tantangan ini . Jika Anda tidak memiliki reputasi yang cukup untuk mengobrol, maka tinggalkan saja komentar.
sumber
'node c:/cell/cell_template.js'
untuk setiap argumen, sama seperti Anda harus menentukan'java CellTemplate'
untuk kode Java. Saya akan membuatnya lebih jelas dalam teks tantangan. Jika Anda masih mengalami masalah, kami (dan siapa pun yang memiliki masalah teknis) dapat melanjutkan diskusi ini di ruang obrolan yang baru saja saya buat .Jawaban:
Inilah bot saya yang relatif sederhana, yang saya programkan di Ruby. Pada dasarnya, ini memprioritaskan membagi terlebih dahulu, dan mencoba untuk membagi terhadap musuh untuk mendapatkan kontrol atas lapangan. Prioritas kedua adalah makan, dan yang ketiga menyerang. Itu dengan mudah mengalahkan sampel sel Python.
sumber
$
.$
digunakan untuk menunjukkan variabel global. Ya, mereka jahat, tetapi dalam program kecil ini, tidak masalah.Amuba
Pertama dibagi menjadi empat dan kemudian mencoba untuk sampai ke jalan tengah untuk membatasi ruang replikasi lawan. Kemudian mulai mereplikasi. Ketika bergerak atau mereplikasi, menemukan jalur optimal ke musuh terdekat, dan bergerak atau membaginya, untuk mencoba memotong ruang yang tersedia musuh.
Jika musuh berdekatan atau satu ruang jauhnya, akan selalu menyerang atau bergerak ke arahnya, memungkinkan barisan di belakang tidak melakukan apa pun untuk mengisi ruang kosong apa pun.
Saya belum menguji ini terhadap kiriman lainnya sehingga tidak tahu seberapa baik kiriman itu.
sumber
Sel sederhana dilakukan di
node.js
. Mengujinya contoh sel node dan melawan Kostronor itu mengalahkan mereka.Memperbarui
Masih cukup sederhana, cobalah bergerak ke arah musuh atau memecah belah.
sumber
Evolusi
Pengajuan ini telah berevolusi dan tidak lagi menjadi organisme sel tunggal yang sederhana! Itu mencoba untuk menyerang / meledak jika memungkinkan, jika tidak membagi atau bergerak ke arah musuh. Bergerak harus menyelesaikan masalah sel yang dikelilingi oleh sel ramah dengan energi maksimal, tidak dapat melakukan sesuatu yang bermanfaat.
Setelah bergerak selalu ada 3 energi tersisa untuk mengenai musuh sekeras mungkin.
sumber
Pengamuk
Karena saya menggunakan Clojure, yang memiliki beberapa keterbatasan, terutama waktu startup yang besar, saya mengambil sedikit hati. Ketika program diberikan
BEGIN
output4 6 2 LOOP
, menunjukkan bahwa itu tidak berhenti. Kemudian dibutuhkan input sebagai aliran berkelanjutan dan diakhiri denganEND
. Itu tidak menyimpan keadaan apa pun, yang dibuat jelas dengan tidak menggunakan variabel global apa pun atau menggunakan kembali nilai pengembalian. Karena implementasi untuk tindakan gila ini belum dilakukan, saya tidak dapat sepenuhnya menguji kode (saya harap kode cukup jelas).Sel mendapatkan namanya dari sifatnya meledak kapan saja memungkinkan (dan dengan demikian memiliki keasaman) dan dengan memprioritaskan serangan tepat setelah membelah.
Saya mengunggah file jar yang dihasilkan ke Dropbox saya . Jalankan dengan
java -jar petridish-clojure.jar
Hanya untuk mengklarifikasi:
Perbarui log
sumber
Bot lapar dan lapar
Berikut ini adalah entri dalam R. Saya harap saya mengerti dengan benar apa spesifikasi teknis tentang cara berkomunikasi dengan program Anda. Harus dipicu dengan
Rscript Hungryhungrybot.R
.Jika memiliki setidaknya 6 energi yang terbagi, lebih disukai ke arah musuh. Kalau tidak, ia memakan apa pun di sebelahnya atau apa pun yang bisa dijangkau. Jika tidak ada makanan yang dapat dijangkau maka itu akan meledak ketika ada lebih banyak musuh di sekitar daripada sel saudara, atau berkelahi dengan musuh di dekatnya. Beristirahat hanya jika energi 0 dan tidak ada makanan yang tersedia.
sumber
Error: unexpected 'else' in "else"
kode Anda. Saya khawatir saya tidak tahu R sama sekali, jadi saya tidak bisa mulai menyelesaikan kesalahan ini. Sebagai referensi, saya mendapatkan kesalahan ini ketika saya menjalankannya di driver dan ketika saya hanya menjalankan program dan mengetik secara manualBEGIN
.Error in if (dir[1] < 0) where <- paste(where, "N", sep = "") : missing value where TRUE/FALSE needed
Error: object 'food' not found
(ketika berhadapan dengan pengajuan Ruby dari Alex, mungkin yang lain)Bakteri terkoordinasi
Saya harap saya tidak terlambat.
Menang melawan lawan lain (dan selalu dengan membunuh mereka semua), dalam ujian saya, dan pertempuran tidak akan pernah berakhir jika menghadapi dirinya sendiri, bukti bahwa strateginya kuat.
Ketika Anda bersel tunggal, Anda dapat menghafal keadaan sebelumnya, tetapi Anda dapat memanfaatkan posisi Anda sendiri untuk berperilaku berbeda! =)
Ini akan membagi bakteri menjadi pembagi dan penggerak, dan dengan melakukan hal itu akan membuat lebih banyak bakteri berguna daripada hanya garis depan, sambil menjaga garis pertahanan naik.
Itu juga mengoordinasikan serangannya untuk fokus pada musuh tertentu, sehingga musuh terbunuh lebih cepat (ini untuk menghadapi sel tunggal saya yang berfokus pada HP).
Di pertengahan permainan, yang terdeteksi oleh jumlah sel di papan, mereka akan mencoba untuk mendorong ke wilayah musuh dengan mengalahkan mereka. Ini adalah strategi pemenang utama.
Ini memiliki tingkat pertumbuhan tertinggi dibandingkan dengan semua lawan lain saat ini, tetapi memiliki awal yang lambat, jadi ini bekerja lebih baik di arena besar.
Jalankan dengan
java CoordinatedBacteria
sumber
Saya pikir saya akan memposting kiriman saya, karena Anda sangat murah hati untuk menambahkan logika boilerplate ...
Ada masalah dalam logika Anda, di mana aksi makan akan mengeluarkan SERANGAN alih-alih MAKAN dan akan membuang-buang mayat.
Saya telah memodifikasi inti Anda sebanyak mungkin untuk memiliki solusi yang berfungsi, yang seharusnya berkinerja relatif baik. Dimulai dengan 4 hp dan 8 energi, jadi setelah dibelah dan istirahat, kedua sel dapat membelah lagi. Ini akan mencoba untuk menggandakan dirinya sendiri, menyerang musuh, memakan mayat dan beristirahat, dalam urutan ini. Jadi sel-sel dalam akan menyimpan 8 titik energi mereka, untuk dengan cepat mengganti sel terluar yang terbunuh dan meninggalkannya 3 titik energi untuk membuat serangan 3 titik atau menggandakan diri setelah satu giliran istirahat. 4 hp akan bertahan setidaknya satu serangan kekuatan penuh.
asam tampaknya menjadi buang-buang poin bagi saya jadi saya tetap keluar ...
Saya tidak menguji pengiriman, karena itu adalah 2 menit;)
ini kode saya:
sumber
Pembom yang menyebar tipis
Karena Anda dengan baik hati memberikan kode boilerplate, saya memutuskan untuk membuat sel sederhana saya sendiri; Sel ini memiliki keasaman 4, hanya 1 hp dan 7 energi. Ia mencoba keluar dari jangkauan teman dan kemudian menunggu di sana (atau makan jika memungkinkan) sampai mendapat kesempatan untuk meledak atau bereplikasi. Menyerang hanya jika itu satu-satunya pilihan.
Ini adalah strategi yang sangat berani dan mungkin akan berkinerja buruk, tapi saya ingin tahu bagaimana melakukannya. Saya akan mengujinya dan memperbaikinya hari ini, mungkin.
sumber
node c:/cells/petri.js 'node c:/cells/bomber.js' 'node c:/cells/sample.js
. Ketika saya mengetik ini di konsol aplikasi node, saya hanya mendapatkan tiga titik, ketika saya mencoba dan menjalankannya di windows cmd, saya mendapatkan: 'node' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dijalankan atau file batch. Saya memang menyimpan semua file sebagai file .js di folder yang benar. Setiap bantuan untuk pemula? Saya akan pergi ke obrolan atau komentar di tempat lain, tetapi perwakilan saya terlalu rendah.if((nearbyEnemies.length - nearbyFriendlies.length > 1 ¦¦
- yang¦¦
sepertinya bukan operator yang valid dan Anda memiliki tanda kurung yang tidak cocok. Saya pikir mungkin pemformatan kode menjadi kacau ketika Anda mempostingnya?=
) ketika yang Anda inginkan adalah perbandingan kesetaraan (==
).