Kontes Selesai! Baca komentar di gumpalan untuk melihat skor mereka.
KoTH ini secara longgar terinspirasi oleh Simulasi Seleksi Alam Primer . Bot Anda adalah gumpalan. Untuk bertahan hidup, Anda harus makan pelet untuk mendapatkan kembali energi, yang digunakan untuk bergerak. Dengan energi ekstra, gumpalan dapat dibagi menjadi dua.
Energi dan Gerakan
Gumpalan Anda memulai setiap putaran dengan 100 energi, dan tidak memiliki batasan jumlah energi yang dapat dikumpulkannya. Setiap putaran dijalankan bergantian, dengan masing-masing gumpalan memiliki pilihan untuk bergerak Utara, Timur, Selatan, atau Barat pada setiap belokan yang diberikan, atau berdiri diam. Bergerak menggunakan 1 energi, dan berdiri masih menggunakan energi 0,25. Panjang sisi peta adalahceil(0.25 * blobCount) * 2 - 1
unit, dengan minimum 9 unit. Semua gumpalan dimulai di tepi peta, dengan satu gumpalan ditempatkan di setiap sudut dan setiap gumpalan berikutnya ditempatkan 2 unit dari yang lain. Setiap 30 putaran, gelombang pelet ditempatkan di tempat-tempat acak di sekitar peta, setidaknya 1 unit dari tepi mana pun. Setiap kali gelombang pelet muncul, jumlah pelet (awalnya dua kali jumlah gumpalan atau lebar peta, mana yang lebih besar) dalam gelombang berikutnya berkurang sebesar 1, memaksa jumlah gumpalan berkurang seiring waktu. Setiap pelet mengembalikan energi antara 5 dan 15. Ketika energi gumpalan kurang dari atau sama dengan 0, ia mati.
Memakan
Jika dua atau lebih gumpalan mencoba untuk menempati lokasi yang sama, yang memiliki energi paling besar akan memakan yang lain, menerima energinya. Jika keduanya memiliki energi yang sama, keduanya lenyap.
Deteksi dan Informasi
Gumpalan dapat melihat pelet atau gumpalan lainnya dalam jarak 4 unit. Ketika fungsinya dipanggil, gumpalan disediakan dengan:
- Panjang sisi peta
- Posisi gumpalan di peta
- Posisi semua pelet dalam radius pencarian mereka, serta nilainya
- Posisi semua gumpalan dalam radius pencarian mereka, serta energi dan UID mereka
- Energi, UID, dan lokasi gumpalan yang fungsinya dijalankan
- Objek penyimpanan yang unik untuk gumpalan
- Objek penyimpanan yang dibagikan oleh semua gumpalan yang terkait dengan gumpalan melalui pemisahan
Pemisahan
Jika gumpalan memiliki lebih dari 50 energi, ia dapat memilih untuk membelah. Membelah biaya energi 50, dan energi yang tersisa dibagi secara merata antara dua gumpalan. Semua gumpalan adalah dokumen asli atau salinan split, dengan setiap salinan ditelusuri kembali ke sumber asli. Semua ini bersama-sama adalah "saudara." Semua kerabat memiliki satu objek penyimpanan komunal. Kerabat masih bisa makan satu sama lain, dan dapat membelah, menggunakan objek penyimpanan mereka sendiri, atau mengumpulkan energi tanpa mempengaruhi orang lain.
Transfer energi
Jika dua gumpalan bersebelahan (setelah bergerak), salah satu bot dapat mentransfer energi ke yang lain. Hal ini dilakukan dengan kembali SendNorth(amt)
, SendEast(amt)
, SendSouth(amt)
, atau SendWest(amt)
, dengan amt
menjadi angka yang mewakili jumlah yang dikirim. Ini dapat berupa jumlah berapa pun yang mampu dibeli pengirim, termasuk semua energinya. Disarankan bahwa gumpalan yang menerima energi diberitahu untuk tetap diam melalui penyimpanan komunal, sehingga tidak bergerak ketika energi sedang ditransfer (meskipun energi tidak akan dikurangkan dari total pengirim dalam kasus ini).
Fungsi, Penyimpanan, dan UID
Untuk memungkinkan perilaku belajar yang lebih kompleks, semua blob akan diberi integer UID (Unique Identifer). UID ini akan dihasilkan secara acak setiap peta, mencegah strategi berdasarkan target individu. Ketika fungsi gumpalan dipanggil, dilewatkan empat argumen:
- Panjang sisi peta sebagai bilangan bulat
- Objek dengan dua array:,
pellets
danblobs
. Kedua array berisi objek, keduanya memilikipos
properti yang berisi posisi pelet atau gumpalan yang diformat sebagai[x,y]
. Pelet akan memilikienergy
properti, sedangkan gumpalan akan memilikiuid
properti danenergy
properti - Sebuah objek yang berisi berbagai properti dari gumpalan itu akan diteruskan ke:
energy
,uid
, danpos
. Thepos
array diformat sebagai[x,y]
- Objek yang berisi dua objek penyimpanan gumpalan. Sebuah
self
properti berisi objek penyimpanan individu yang dapat dimodifikasi namun gumpalan melihat cocok (dengan memanipulasi properti dari objek yang dilewatkan), dancommunal
properti yang dapat dimodifikasi oleh relatif apapun.
Gumpalan tidak dipindahkan segera untuk mencegah ternyata lebih awal / lambat memiliki keuntungan. Semua gerakan diproses dalam kelompok (Semua tabrakan / makan, maka semua pelet, lalu pemisahan, dll.) Jika gumpalan mendarat di pelet atau gumpalan yang lebih kecil dan, dalam proses menggunakan energi terakhirnya, gumpalan tersebut akan tetap memakan pelet / energi terlepas dari apakah itu akan membawa total energi di atas 0.
Agar gumpalan relatif mengenali satu sama lain, penyimpanan komunal harus digunakan untuk setiap gumpalan untuk merekam UID-nya dalam array, atau melalui beberapa sistem lain.
Nilai Pengembalian
Untuk memindahkan atau membagi, nilai kembali fungsi digunakan. Pertama, arti dari arah mata angin dalam hal koordinat:
- Utara = -Y
- Timur = + X
- Selatan = + Y
- Barat = -X
Perhatikan bahwa itu [0,0]
adalah sudut kiri atas , dan Y meningkat saat Anda turun. Nilai pengembalian fungsi harus mengikuti aturan berikut:
- Untuk tidak melakukan apa pun: Mengembalikan apa pun, 0, nol, tidak terdefinisi, salah, atau nilai lain apa pun yang setara dengan salah
- Untuk Pindah: Kembalikan satu dari empat variabel global: Utara, Timur, Selatan, atau Barat, yang sama dengan "utara", "timur", "selatan", atau "barat" (yang juga dapat digunakan sebagai nilai pengembalian)
- Untuk Berpisah: Kembalikan variabel global SplitNorth, SplitEast, SplitSouth, atau SplitWest, arah yang menunjukkan di mana menempatkan gumpalan baru
Jika perintah split dikembalikan dan jumlah energi yang dibutuhkan lebih besar atau sama dengan energi gumpalan, tidak ada yang akan terjadi. Gumpalan tidak akan dapat meninggalkan peta.
Fungsi Perpustakaan yang Sudah Ditentukan
Ada beberapa fungsi dasar yang tersedia secara default, untuk menghemat waktu:
taxiDist (pt1, pt2)
Mengembalikan jarak taksi antara dua titik (jarak X ditambah jarak Y).
taxiDist([0, 0], [2, 2]) //4
taxiDist([3, 4], [1, 5]) //3
taxiDist([1.25, 1.3], [1.3, 1.4]) //0.15
taxiDist([0, 0], [5, 2.5], 2.5) //3
taxiDist([0, 0], [2, 4], 2.5) //2.4
hypotDist (pt1, pt2)
Mengembalikan jarak antara dua titik sesuai dengan teorema pythagoras
hypotDist([0, 0], [5, 12]) //13
hypotDist([4, 6], [8, 9]) //5
hypotDist([0, 1], [2, 1]) //2
hypotDist([1, 1], [2, 2]) //sqrt(2)
modDir (dir, amt)
Mengambil arah yang dimasukkan, berputar 90 derajat searah jarum jam amt
, lalu mengembalikan nilai baru.
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
Contoh Gumpalan
Gumpalan ini tidak akan bergerak sampai ia menemukan pelet di dekatnya. Kemudian, itu akan bergerak ke arah yang menurutnya paling mungkin untuk menghargai itu. Jika energinya pernah di atas 150, itu akan terpecah.
function(map, near, me, storage) {
if (me.energy > 150)
return SplitNorth;
if (!near.pellets.length)
return null;
var dirs = [0, 0, 0, 0];
for (let p, i = 0; i < near.pellets.length; i++) {
p = near.pellets[i];
dirs[0] += me.pos[1] - p.pos[1];
dirs[1] += p.pos[0] - me.pos[0];
dirs[2] += p.pos[1] - me.pos[1];
dirs[3] += me.pos[0] - p.pos[0];
}
return [North, East, South, West][dirs.indexOf(Math.max(...dirs))];
}
Aturan
- Celah Standar dilarang. Juga, tidak ada lubang tidak standar.
- Tidak ada gumpalan yang dapat mencoba untuk mengubah atau membaca data apa pun yang tidak diteruskan melalui parameternya
- Tidak ada gumpalan yang dapat mencoba untuk memodifikasi variabel nilai-kembali untuk menyabot gumpalan lainnya
- Putaran berlangsung sampai satu-satunya gumpalan yang tersisa adalah saudara
- Tidak ada gumpalan yang dapat memodifikasi data dengan menyuntikkan fungsi ke dalam parameternya yang mengubah nilai menggunakan
this
kata kunci - Semua kiriman harus dalam Javascript atau bahasa yang tidak terlalu berbeda dari Javascript (Python, misalnya). Semua jawaban akan dikonversi ke Javascript untuk kompetisi.
- Pemenangnya adalah gumpalan yang telah mengumpulkan total energi tertinggi di semua putaran (dari pelet atau mengkonsumsi gumpalan kecil yang bukan saudara)
Pengontrol: https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
Ruang Obrolan: https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth
sumber
Jawaban:
Introvert
Introvert tidak suka gumpalan lainnya. Ketika ia melihat gumpalan yang tidak terkait, ia memakannya jika ia bisa, dan dengan enggan menerima kehadirannya jika tidak bisa, meskipun melarikan diri jika ia melihat tanda-tanda agresi. Ketika ia melihat gumpalan terkait , itu jarak itu sendiri. Namun, tidak bisa tidak banyak terpecah belah.
Detail Teknis
Fitur inti dari gumpalan ini adalah untuk membelah dan menyebar sehingga memaksimalkan visi gabungan gumpalan. Itu juga menggunakan sistem untuk mencegah dua dari mereka bersaing atas pelet.
sumber
Makanan Animasi
Bot sederhana, hanya untuk memulai kompetisi. Temukan koin terdekat, dan lanjutkan ke sana. Berdasarkan contoh bot.
sumber
tester bloblib
Bot sebenarnya cukup sederhana, tetapi ini lebih dirancang sebagai bukti konsep
bloblib
, kumpulan fungsi dan fungsi yang saya rencanakan untuk gunakan dan kembangkan di seluruh bot lain (jangan ragu untuk menggunakan / memperluasnya sendiri juga)Singkatnya, bot ini melakukan hal berikut:
sumber
Pengecut serakah
Atau, dalam JavaScript,
Bot ini tidak terlalu menarik. Kerjanya sesuai dengan dua prioritas:
Ia tidak pernah meludah untuk memaksimalkan kemampuannya untuk memakan makanan lain.
sumber
SafetyBlob
Bot ini menggunakan beberapa logika yang sama dengan Safetycoin dari KOTH sebelumnya.
Bagaimana fungsinya
Bot ini akan menuju makanan yang dapat dijangkau sebelum bot yang lebih besar melakukan atau pada saat yang sama / sebelum bot yang lebih kecil. Jika tidak bisa melihat makanan yang memenuhi kriteria ini, ia akan bergerak ke arah acak (bias ke pusat). Jika energi mencapai 150 dan tidak bisa melihat makanan yang aman, ia akan terbelah menjadi salah satu arah yang dicap aman untuk dipindahkan.
Bot ini tidak melacak anak-anaknya sendiri tetapi mereka tidak boleh bertabrakan karena mekanisme keselamatan.
sumber