Yaşam oyununu 3D olarak uygulayın


17

Zorluk, yaşam oyununun 3D olarak en kısa uygulamasını bulmaktır ( örnek ). Kurallar şunlardır:

Sadece 1 veya daha az komşusu olan hücreler (bu durumda küpler) sanki yalnızlık gibi ölür.
Tam olarak 5 hücre boş bir hücreyi çevreliyorsa, ürer ve doldururlar.
Bir hücrenin 8 veya daha fazla komşusu varsa, aşırı kalabalıktan ölür.

Katmanların şu şekilde ayrı ayrı çıkarıldığı en az 10x10x10 yapın:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 X 0 0 X 0 0 0 0 0
0 0 X X X 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Tabii ki, bir grafik 3D simülasyon da kabul edilir
. Herhangi bir sayıda nesli hesaplayabilmeli ve kullanıcı bir sonraki nesli manuel olarak isteyebilmelidir.

Karakterlerde en kısa kod kazanır!

Ben herhangi bir (küp) boyutu için bu benim kendi uygulama yaptı: http://jensrenders.site88.net/life3D.htm Bunu test etmek için kullanabilirsiniz, ve ben yorum yapmadı, ancak kod benim temel .


1
İfadenizdeki code-golf etiketini içeren en kısa uygulamayı bulabilirsiniz . Lütfen ne istediğinizi kontrol edin. Ayrıca, nasıl girileceği, kaç döngü, animasyonlu evet / hayır, ... hakkında bazı ayrıntılar vermelisiniz, çünkü kod golfünün sağlam bir spesifikasyona sahip olması çok önemlidir.
Howard

@Biraz daha spesifikasyon ekledim ve evet, code-golf etiketini unuttum;) bunun için teşekkürler.
Jens Renders

@PeterTaylor Evet tam olarak 5, düzenleyeceğim.
Jens Renders

Çıktı formatı hakkında spesifikasyonlar eklerdim (örneğin, her hücrenin örnekte olduğu gibi bir boşlukla ayrılması gerekir, çıktının her ızgara katmanı, yaşayan ve ölü hücreler arasındaki bir satırsonu farklı karakterler tarafından temsil edilmelidir ve bunlar görünür karakterler olmalıdır .) Ayrıca, kod-golf olarak çerçevelendiğinde grafik simülasyonları alma olasılığınızın olmadığını unutmayın.
Jonathan Van Matre

Bu meta dizide tartışılan tüm boşlukları mı yoksa yalnızca (dis) onay kriterlerini karşılayanları (+5 puanı, aşağı oyların en az iki katına kadar) yasaklamak mı istediniz? Çünkü tamamen tartışmak için oldukça ilginç bazı "boşluklar" düşünebileceğime eminim ... ;-)
Ilmari Karonen

Yanıtlar:


14

Mathematica - 120 bayt

g=CellularAutomaton[{(l=Flatten@#;c=l[[14]];n=Total@Drop[l,{14}];Which[n<2||n>7,0,n==5||c==1,1,0<1,0])&,{},{1,1,1}},##]&

Kesinlikle galibiyet için bir yarışmacı değil, ama niyetim bu değildi. Ayrıca, bu sadece kural numarasını anlayarak önemli ölçüde azaltılabilir. Sadece gerçekten bir görselleştirme yazmak istedim (aslında orada ton olduğundan eminim). İşte başlıyoruz):

animateGol3d[size_, i_, n_] := 
  ListAnimate[
    Graphics3D[
      Cuboid /@ Position[#, 1], 
      PlotRange -> {{0, size}, {0, size}, {0, size}} + 1
    ] & /@ g[i, n]
  ];

Ve bir dizi başlangıç ​​koşulunu denedikten sonra, aşağıdaki gibi şeyler aldım:

resim açıklamasını buraya girin

Ve burada ızgara boyutu olan biri 20x20x20. Bu, simüle etmek ve oluşturmak için birkaç saniye sürdü:

resim açıklamasını buraya girin

Bu arada, bu periyodik sınır koşullarını varsayar.


Gerçekten bir denge durumuna mı giriyorlar, yoksa sadece animasyon duruyor mu? Eğer birincisi, bana bazı güzel fikirler
verdin

1
@Kroltan Bir süre oldu, ama dengeye ulaştıklarından eminim.
Martin Ender

1
Güzel, teşekkürler. Dengenin bireysel dilimleri, çok kaba bir oyun demek için çok oda-harita-y'ye benziyor.
Kroltan

12

APL, 46

Biraz zamanımı aldı, ama 46 karaktere indirdim:

{(5=m)∨⍵∧3>|5.5-m←⊃+/,i∘.⌽i∘.⊖(i←2-⍳3)⌽[2]¨⊂⍵}

Bu, herhangi bir boyutta bir boole 3D matrisi alan ve verilen kurallara göre yeni nesli hesaplayan bir işlevdir. Sınır koşulları belirtilmedi, bu yüzden toroidal boşlukta olduğu gibi diğer tarafın etrafına sarmayı seçtim.

açıklama

{                           ⊂⍵}   Take the argument matrix and enclose it in a scalar
               (i←2-⍳3)           Prepare an array with values -1 0 1 and call it i
                       ⌽[2]¨      Shift the matrix along the 2nd dim. by each of -1 0 1
           i∘.⊖                   Then for each result do the same along the 1st dimension
       i∘.⌽                       And for each result again along the 3rd dimension
 m←⊃+/,                           Sum element-wise all 27 shifted matrices and call it m

Ara sonuç m, orijinal matrisle aynı şekle sahip bir matristir; bu, her eleman için kendisi de dahil olmak üzere 3 × 3 × 3 mahallesinde kaç hücrenin canlı olduğunu sayar. Sonra:

           |5.5-m   For each element (x) in m, take its distance from 5.5
       ⍵∧3>         If that distance is <3 (which means 3≤x≤8) and the original cell was 1,
 (5=m)∨             or if the element of m is 5, then the next generation cell will be 1.

Misal

Yaklaşık 1/3 hücre = 1 ile rastgele bir 4 × 4 × 4 matrisi tanımlayın ve 1. ve 2. nesillerini hesaplayın. ⊂[2 3]Ön dikey yatay yerine uçakları yazdırmak için sadece bir hile:

      ⊂[2 3] m←1=?4 4 4⍴3
 1 0 0 0  1 0 1 0  1 0 1 0  0 0 0 1 
 1 1 0 0  0 0 0 0  0 0 0 1  1 0 1 0 
 0 0 0 0  0 1 0 0  0 0 0 0  0 0 1 0 
 1 1 0 0  0 0 0 1  1 0 0 1  0 0 1 0 
      ⊂[2 3] {(5=m)∨⍵∧3>|5.5-m←⊃+/,i∘.⌽i∘.⊖(i←2-⍳3)⌽[2]¨⊂⍵} m
 0 0 0 0  0 0 1 0  1 0 1 0  0 0 0 0 
 1 0 0 0  0 0 1 0  0 0 0 0  1 0 1 0 
 0 0 0 0  0 1 0 0  0 0 0 0  0 0 1 0 
 1 1 0 0  0 0 0 0  1 0 0 0  0 0 1 0 
      ⊂[2 3] {(5=m)∨⍵∧3>|5.5-m←⊃+/,i∘.⌽i∘.⊖(i←2-⍳3)⌽[2]¨⊂⍵}⍣2⊢ m
 0 0 1 0  1 0 1 0  1 0 1 0  0 0 0 0 
 1 0 1 0  0 0 1 1  0 0 0 0  1 0 1 0 
 1 0 0 0  1 1 0 0  0 0 1 0  1 0 1 0 
 1 1 1 0  1 0 0 1  1 0 1 0  0 0 1 0 

+1 Çok güzel bir cevap! ve gerçekten de sınırlar belirtilmediğinden etrafa sarılmaya izin verildi.
Jens Renders

9

J - 42 karakter

Her üç boyutta da toroidal bir tahta (etrafı sarar) varsayıyoruz. J'nin sonuçların otomatik olarak gösterilmesi, 1canlı hücreler ve 0ölüler için çıktı spesifikasyonunu takip ediyor gibi görünüyor . Bu kod, herhangi bir genişlik, uzunluk ve yükseklikte panolarda çalışır (10x10x10, 4x5x6 vb. Olabilir).

(((1&<*<&8)@-*]+.5=-)~[:+/(,{3#<i:1)|.&><)

Bir açıklama şöyle:

  • ,{3#<i:1 - Hücre ve tüm komşuları için ofset listesinin alt ifadesi.
    • <i:1 - 1 ve -1 dahil tamsayıların listesi.
    • ,{3#- Listenin ( 3#) üç kopyasını alın ve Kartezyen ürünü ( ,{) alın.
  • (,{3#<i:1)|.&><- Her 3B ofseti kümesi için diziyi kaydırın. 3 karakterlik bir ücret karşılığında değiştirebilirsiniz |.&>için |.!.0&>çepeçevre yok etmek.
  • [:+/ - Değiştirilen tüm panoları bir araya toplayın.
  • ((1&<*<&8)@-*]+.5=-)~- Uzun dış fiil bir kanca idi, bu yüzden sol ve sağdaki tahtayı ve sağ taraftaki kaydırma ve topladığımız tarafı alır. ~Takasları bu iç fiil için bu çevrede.
    • 5=- - kaydırılan panoların toplamının eksi orijinal kartın (yani komşu sayım) diğer hücrelerde 5 ve 0 olduğu her hücrede 1.
    • ]+. - Orijinal tahta ile mantıksal VEYA yukarı.
    • (1&<*<&8) - 1 ile 8 arasında karşılaştırma yapılırsa 1, aksi takdirde 0.
    • (1&<*<&8)@-* - Komşu sayısını karşılaştırın (yukarıdaki gibi) ve bununla mantıksal OR sonucunu çarpın (yani, etki alanı yalnızca 1 veya 0 olduğunda mantıksal VE).

Kullanım APL'de olduğu gibi, her adım için işlevi ilk karta uygulayın. J, ^:bunu kolaylaştırmak için işlevsel bir güç operatörüne sahiptir.

   life =: (((1&<*<&8)@-*]+.5=-)~[:+/(,{3#<i:1)|.&><)  NB. for convenience
   board =: 1 = ?. 4 4 4 $ 4  NB. "random" 4x4x4 board with approx 1/4 ones
   <"2 board  NB. we box each 2D plane for easier viewing
+-------+-------+-------+-------+
|0 0 0 0|1 1 0 0|0 1 0 0|0 0 1 0|
|0 1 0 0|0 0 0 0|0 0 0 1|1 0 0 0|
|0 0 0 0|0 0 1 0|0 1 0 0|0 0 0 1|
|1 1 0 0|1 0 0 0|0 0 0 1|0 1 1 0|
+-------+-------+-------+-------+
   <"2 life board
+-------+-------+-------+-------+
|0 0 0 0|0 1 0 1|0 1 0 0|0 0 1 0|
|1 1 1 1|0 0 0 0|0 0 0 1|1 1 0 0|
|0 0 0 0|0 0 1 1|0 1 0 0|0 0 0 1|
|1 0 0 0|1 0 0 1|0 0 0 1|0 1 1 1|
+-------+-------+-------+-------+
   <"2 life^:2 board  NB. two steps
+-------+-------+-------+-------+
|0 0 0 0|0 1 0 0|0 1 0 0|0 0 0 0|
|0 1 0 0|0 0 0 0|0 0 0 1|0 1 0 0|
|0 0 0 0|0 0 0 0|0 1 0 0|0 0 0 0|
|0 0 0 0|0 0 0 1|0 0 0 0|0 1 1 1|
+-------+-------+-------+-------+
   <"2 life^:3 board  NB. etc
+-------+-------+-------+-------+
|0 1 0 0|1 1 1 0|0 1 0 0|0 1 0 0|
|0 1 0 0|1 0 1 0|1 0 1 0|1 1 1 0|
|1 0 0 0|0 0 0 0|0 1 0 0|0 1 0 0|
|0 0 1 0|0 0 0 0|0 1 0 0|0 1 1 0|
+-------+-------+-------+-------+

"Rastgele" diyorum çünkü ?.ilkel her seferinde sabit bir tohum kullanarak tekrarlanabilir rastgele sonuçlar veriyor. ?gerçek RNG'dir.


Lanet J ve kötü |.fiil !! Aferin.
Tobia
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.