Bir arı kovanının garip hayatı


19

Araştırmacılar son zamanlarda sonsuz bir petek tarlasında yaşayan ilginç bir arı kolonisi keşfettiler:

Bal peteği

Her hücrede arı olabilir veya olmayabilir. Aslında, bu canlıların yaşamları biraz ... kaotik görünüyor. Bir koloninin her zaman aşağıdaki kalıpla başladığı hesaplanabilir:

İlk desen

(Arı çizdiği Emmanuel BOUTET ile ortak bir havuz deposundan . Bu petek-ve-arı görüntüsü böylece altında yayınlanan CC-by-SA . Grumbles )

Bundan sonra arının yaşam döngüleri sözde nesillere ayrılır. Her nesil yaşlı arılar ölür ve yenileri yumurtadan çıkar ve esas olarak hücrelerinin komşularına bağlıdır:

  • Bir arının ikiden az komşusu varsa, yalnızlık nedeniyle ölür.
  • Bir arının üçten fazla komşusu varsa, aşırı kalabalık nedeniyle ölür.
  • Bir hücrenin komşu hücrelerde iki, üç veya dört canlı arısı varsa, yeni nesil orada yeni bir arı yumurtadan çıkar.

Ölmekte olan arılar bir jenerasyonun sonuna kadar ölmezler, bu nedenle hala gelecek nesilde arıların yumurtadan çıkabileceği çevre hücreleri etkilerler.

Artık böyle bir koloninin nasıl çalıştığını bildiğimize göre, herhangi bir sayıda kuşak boyunca simüle edebiliriz.

Giriş

Giriş, bir satır sonu ile sonlandırılan standart girişte verilen tek bir N sayısıdır . 0 ≤ N ≤ 150. Bu, simüle edilecek nesillerdir.

Çıktı

Çıktı, standart çıktıda tek bir sayıdır ve isteğe bağlı olarak N nesillerinden sonra yaşayan arıların sayısını temsil eden tek bir satır sonu gelir .

Standart hatadaki ek çıktı yoksayılır.

Örnek girişler

0
5
42
100

Örnek çıktılar

6
44
1029
5296

Kazanma koşulu

Golf alışıldığı gibi en kısa kod kazanır. Beraberlik durumunda, önceki çözüm kazanır.

Test senaryoları

Özdeş test senaryoları içeren iki test komut dosyası vardır:

Her iki durumda da çağırma: <test script> <my program> [arguments]örn. ./test ruby beehive.rbVeya ./test.ps1 ./beehive.exe.

151 yerine sadece 22 test olduğunu biliyorum (esas olarak çözümler genellikle oldukça yavaştır). Lütfen görevi çözmek yerine tam test senaryolarını yerleştirmekten kaçının. Bu komut dosyaları, bir değişikliğin programın doğru şekilde davranmasına neden olup olmadığını sınamanız için kolaylık sağlar; kodunuzu belirli test senaryolarına uyarlayabileceğinizden değil.

Başka bir not

Bu görev 2011-W24 boyunca üniversitemde düzenlenen bir golf yarışmasının bir parçasıydı. Yarışmacılarımızın puanları ve dilleri şöyleydi:

  • 336 - C
  • 363 - C
  • 387 - C
  • 389 - Haskell
  • 455 - C

Kendi çözümümüz

  • 230 - Yakut

Bu biraz Conway'in hayat oyununa benziyor.
Peter Olson

Elbette; bu yüzden de bu şekilde etiketlendi. Gerçekten çok ince örtülü.
Joey

Yanıtlar:


9

Yakut, 181 163 153 146 karakter

h=[0]*4e4
[0,-200,201,202,2,3].map{|i|h[i]=1}
gets.to_i.times{h=h.map{[g=1,200,201].map{|x|g+=h[x]+h[-x]};g>5-h.rotate![-1]||g<3?0:1}}
p h.count 1

Bu uygulama , her elemanın (arı yok) veya (arı dahil) olduğu bir dizi h(boyutlar 200x 200düzleştirilmiş) kullanarak standart bir yaklaşımı izler . Dizi , arıların başlangıç ​​pozisyonlarını tanımlar (herhangi bir başlangıç ​​hücresine göre).01[0,-200,201,202,2,3]

Yukarıda belirtildiği gibi giriş ve çıkış, tanımlanan tüm test senaryolarını geçer.

Düzenleme 1: "ek alan" sürümü yerine bir sarma çözümüne dönüştü (ara sürümde daha kısa ancak şimdi birkaç karakter daha uzun).

Edit 2: Değişken btamamen kaldırıldı .

Edit 3: Warning: Bu düzenleme programı korkunç derecede yavaşlattı. Böylece boyutları, her biri 150 tekrar için yeterli olan 200'e düşürdüm. Diziyi bir değişkenle indekslemek yerine diziyi sürekli olarak döndürürüz. Gerçekten iyi bir tasarım değil, ama şimdi 150'nin oldukça altındayız.


7

Python, 152 karakter

P=[0,2,3,1j,1+1j,1-1j]
for i in' '*input():Q=[p+d for d in(1,-1,1j,-1j,1j-1,1-1j)for p in P];P=set(p for p in Q if 1<Q.count(p)<5-(p in P))
print len(P)

Bu çözüm, bir dizi karmaşık sayı ile arı konumlarını takip eder. Oldukça yavaş çünkü iç döngü arıların sayısında ikinci dereceden. 50'ye kadar test yaptım ve işe yarıyor.


Python2.7 anlayış
kazandı

Arıları izlemeyi düşündüm, ama bunun gibi karmaşık sayılarla yapmak gerçekten temiz! Ayrıca for döngüsünü bir exec (benim yaptığım gibi) ile değiştirerek 3 karakter kaydedebilirsiniz.
Jules Olléon

Python2.7 de değişmez değerleri ayarladı, böylece yazıp P={0,2,3,1j,1+1j,1-1j}daha sonra {p}<Püyeliği test etmek için kullanabilirsiniz (1 karakter kaydeder)
gnibbler

5

Python, 171 169 158 karakter

w=300
s=w*w
x=[0]*297
h=[1,1,0]+x+[1,0,1,1]+x+[1]+x*s
exec('h=[1<sum(h[(i+x)%s]for x in[-1,-w-1,-w,1,w+1,w])<5-h[i]for i in range(s)];'*input())
print sum(h)

Ben (300 * 300 = 900.000 1D dizi olarak dünya modeli hde çünkü bir arı 1 ve boş olduğu, aslında daha büyük, ancak son kullanılmaz) 0. 300 Boyut cezası olan en büyümesi olacaktır Her nesil için her boyutta 2 ve 150'den fazla nesil yoktur.

İşte biraz ungolfed ve yorumlanmış sürüm:

w=300 # width and height of the world
s=w*w
# create initial grid
l=[1,1]+[0]*298+[1,0,1,1]+[0]*297+[1]+[0]*s

for k in range(input()):
  h=l[:]

  for i in range(s):

    # for each point, compute the number of neighbors
    n=sum(map(lambda x:h[(i+x)%s],[-1,-w-1,-w,1,w+1,w]))

    # if that number verifies the conditions, put 1 here, if not put 0
    l[i]=1<n<5-h[i]

print sum(l)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.