Yarışma Tamamlandı! Puanlarını görmek için lekeler hakkındaki yorumları okuyun.
Bu KoTH, Primer'in Doğal Seleksiyon Simülasyonundan gevşek bir şekilde esinlenmiştir . Botun bir damla. Hayatta kalmak için, hareket etmek için kullanılan enerjiyi geri kazanmak için peletler yemelisiniz. Ekstra enerji ile lekeler ikiye ayrılabilir.
Enerji ve Hareket
Blobunuz her turda 100 enerji ile başlar ve toplayabileceği enerji miktarı üzerinde bir sınırı yoktur. Her tur sırayla yapılır, her bir damla herhangi bir sırayla Kuzey, Doğu, Güney veya Batı'yı hareket ettirme veya hareketsiz durma seçeneğine sahiptir. Hareket etmek 1 enerji kullanır ve ayakta durmak 0.25 enerji kullanır. Haritanın yan uzunluğu:ceil(0.25 * blobCount) * 2 - 1
birim, en az 9 birim. Tüm damlalar haritanın kenarında başlar, her köşeye birer tane yerleştirilir ve sonraki tüm damlalar diğerlerinden 2 birim uzağa yerleştirilir. Her 30 turda, bir pelet dalgası haritanın etrafında rastgele noktalara yerleştirilir, herhangi bir kenardan en az 1 birim. Bir pelet dalgası her göründüğünde, bir sonraki dalgadaki pelet miktarı (orijinal olarak lekelerin sayısının iki katı veya haritanın genişliğinin hangisi daha büyükse) 1 azalır ve lekelerin sayısını zamanla azalmaya zorlar. Her pelet 5 ila 15 enerji geri yükler. Bir blobun enerjisi 0'a eşit veya 0 olduğunda, ölür.
Yemek yiyor
İki veya daha fazla leke aynı yeri işgal etmeye çalışırsa, en fazla enerjiye sahip olan, enerjilerini alarak diğerlerini yiyecektir. Her ikisinin de eşit enerjisi varsa, her ikisi de yok olur.
Tespit ve Bilgi
Lekeler 4 birim mesafede herhangi bir topak veya diğer lekeleri görebilir. İşlevleri çağrıldığında, lekelere aşağıdakiler sağlanır:
- Haritanın yan uzunluğu
- Blobun haritadaki konumu
- Arama yarıçaplarındaki tüm peletlerin konumları ve değerleri
- Tüm yarıçapların arama yarıçaplarındaki konumları, ayrıca enerji ve UID'leri
- İşlevi yürütülen blobun enerjisi, UID'si ve konumları
- Lekeye özgü bir depolama nesnesi
- Bölme ile kabarcık ile ilgili tüm damlalar tarafından paylaşılan bir depolama nesnesi
bölme
Bir damla 50'den fazla enerjiye sahipse, bölünmeyi seçebilir. Bölme işlemi 50 enerjiye mal olur ve kalan enerji iki damla arasında eşit olarak bölünür. Tüm lekeler orijinal veya bölünmüş kopyadır, her kopya orijinale kadar izlenir. Bunların hepsi birlikte "akraba". Tüm akrabaların bir ortak depolama nesnesi vardır. Akrabalar hala birbirlerini yiyebilir ve başkalarını etkilemeden bölünebilir, kendi depolama nesnelerini kullanabilir veya enerji toplayabilir.
Enerji transferi
Yan yana iki damla varsa (hareket ettikten sonra), botlardan biri diğerine enerji aktarabilir. Bu dönen yapılır SendNorth(amt)
, SendEast(amt)
, SendSouth(amt)
veya SendWest(amt)
birlikte amt
olmak miktarını temsil eden bir sayı gönderilen. Bu, göndericinin tüm enerjisi dahil olmak üzere alabileceği herhangi bir miktar olabilir. Enerji alan blobun, ortak depolama yoluyla hareketsiz kalması söylenir, böylece enerji aktarılırken uzaklaşmaz (bu durumda enerji gönderenin toplamından düşülmez).
İşlevler, Depolama ve UID'ler
Daha karmaşık öğrenme davranışlarına izin vermek için, tüm bloblara bir tamsayı UID'si (Benzersiz Tanımlayıcı) verilecektir. Bu UID'ler her haritayı rastgele oluşturularak bireysel hedeflere dayalı stratejileri önleyecektir. Bir blobun işlevi çağrıldığında, dört argüman geçirilir:
- Haritanın tamsayı olarak yan uzunluğu
- İki dizili bir nesne:,
pellets
veblobs
. Her iki dizide de, her ikisipos
de pelet veya damla şeklini içeren bir özelliğe sahip nesneler bulunur[x,y]
. Peletler birenergy
mülke sahip olacak , lekeler biruid
mülke ve birenergy
mülke sahip olacak - Damla çeşitli özelliklerini içeren bir nesne geçirilir:
energy
,uid
vepos
.pos
Dizi olarak biçimlendirilir[x,y]
- Blobun iki depolama nesnesini içeren bir nesne. Bir
self
özellik, değiştirilebilen ayrı bir depolama nesnesi içerir, ancak damla uygun görür (iletilen nesnenin özelliklerinicommunal
değiştirerek) ve herhangi bir akraba tarafından değiştirilebilen bir özellik.
Lekeler, daha erken / daha sonraki dönüşlerin avantajlı olmasını önlemek için hemen hareket ettirilmez. Tüm hareketler gruplar halinde işlenir (Tüm çarpışmalar / yeme, sonra tüm peletler, daha sonra bölünme, vb.) Bir damla bir pelete veya daha küçük bir damla üzerine düşerse ve süreçte son enerji pelet / bunun toplam enerjisini 0'ın üzerine getirip getirmeyeceğinden bağımsız olarak enerji.
Göreli blobların birbirini tanıması için, her blobun UID'sini bir dizide veya başka bir sistemde kaydetmek için ortak depolama kullanılmalıdır.
Dönüş Değerleri
Taşımak veya bölmek için, işlevin dönüş değeri kullanılır. İlk olarak, kardinal yönlerin koordinatlar açısından anlamı:
- Kuzey = -Y
- Doğu = + X
- Güney = + Y
- Batı = -X
Not [0,0]
olan sol üst köşe aşağı giderken, ve Y artar. İşlevin dönüş değeri şu kurallara uymalıdır:
- Yapılacak bir şey yok: 0, null, undefined, false veya false değerine eşit olan başka bir değer döndürmez
- Taşımak için: Dört küresel değişkenden birini döndürün: Kuzey, Doğu, Güney veya Batı, "kuzey", "doğu", "güney" veya "batı" (dönüş değeri olarak da kullanılabilir)
- Bölmek için: Genel bloğu SplitNorth, SplitEast, SplitSouth veya SplitWest olarak döndürün; yeni blobun nereye yerleştirileceğini gösterir
Bölünmüş bir komut döndürülürse ve gereken enerji miktarı blobun enerjisinden büyük veya ona eşitse, hiçbir şey olmaz. Lekeler haritayı terk edemez.
Önceden Tanımlı Kütüphane İşlevleri
Biraz zaman kazanmak için varsayılan olarak birkaç temel işlev vardır:
taxiDist (pt1, pt2)
İki nokta arasındaki taksi mesafesini döndürür (X mesafesi artı Y mesafesi).
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)
Pisagor teoremine göre iki nokta arasındaki mesafeyi döndürür
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)
Girilen yönü alır, saat yönünde 90 derece döner amt
, ardından yeni değeri döndürür.
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
Örnek Blob
Bu damla yakındaki bir peleti bulana kadar hareket etmeyecektir. Daha sonra, ödüllendirmenin en muhtemel olduğunu düşündüğü yönde hareket edecektir. Enerjisi 150'den fazla olursa, bölünecektir.
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))];
}
kurallar
- Standart Loopholes yasaktır. Ayrıca, Standart Dışı Loopholes yok.
- Hiçbir blob, parametreleri aracılığıyla kendisine aktarılmayan verileri değiştirmeye veya okumaya çalışamaz
- Hiçbir damla diğer damlaları sabote etmek için bir dönüş-değer değişkenini değiştirmeye çalışamaz
- Geri kalan tek lekeler akraba olana kadar bir tur sürer
- Hiçbir damla kullanarak değerleri değiştirebilir kendi parametrelerine fonksiyonlarını enjekte ederek verileri değiştirebilir
this
anahtar kelime - Tüm gönderimler ya Javascript ya da Javascript'ten çok farklı olmayan bir dilde olmalıdır (örneğin, Python). Tüm cevaplar yarışma için Javascript'e dönüştürülecektir.
- Kazanan, tüm turlarda (peletlerden veya akraba olmayan daha küçük lekeler tüketerek) toplamda en yüksek miktarda enerji toplayan damladır.
Denetleyici: https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
Sohbet odası: https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth