Yaşam Kurallarını Değiştirin


15

Yaşam benzeri hücresel otomatlar , Conway'in Hayat Oyununa benzeyen hücresel otomatlardır, çünkü her bir hücrenin tam olarak 8 komşusuna sahip olduğu ve canlı ve ölü olan 2 durumdan biri olan (teorik olarak) sonsuz büyük bir kare ızgara üzerinde çalışırlar. .

Bununla birlikte, bu Benzeri versiyonlar önemli bir şekilde farklıdır: belirli bir hücrenin canlanması için kurallar ve belirli bir hücrenin bir sonraki kuşağa hayatta kalması için kurallar.

Örneğin, klasik Yaşam Oyunu kuralı kullanır B3/S23, yani yeni bir hücrenin doğması için 3 canlı hücre ve hayatta kalmak için 2 veya 3 yaşayan komşu gerekir. Bu meydan okuma için, komşuların kendisini içermediğini varsayacağız, bu nedenle her hücrenin tam olarak 8 komşusu var.

Göreviniz, bir başlangıç ​​yapılandırması, bir doğum kuralı, bir hayatta kalma kuralı ve pozitif bir tam sayı (çalıştırılacak nesil sayısı) verildiğinde, mümkün olan en kısa kodda verilen nesil sayısı için bu kuralları kullanarak Yaşam benzeri otomatı simüle eder. . Başlangıç ​​yapılandırması bir kare matris / 2 boyutlu dizi veya çok satırlı bir dize olacaktır, seçebilirsiniz. Diğerleri herhangi bir makul biçimde ve yöntemde verilebilir.

Örneğin, doğum kuralı 12345678(yaşayan komşular) ise, hayatta kalma kuralıydı 2357ve başlangıç ​​yapılandırması

0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0

gelecek iki nesil

Generation 1:           Generation 2:

0 0 0 0 0               1 1 1 1 1
0 1 1 1 0               1 1 0 1 1
0 1 0 1 0               1 0 1 0 1
0 1 1 1 0               1 1 0 1 1
0 0 0 0 0               1 1 1 1 1

Verilen nesillerin sayısı 10 olsaydı, çıktı,

0 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
0 1 1 1 0

Giriş matrisi tarafından verilen sınırların dışında gerçekleşen değişiklikleri işlemeniz gerekmez, ancak matris dışındaki tüm hücreler ölmeye başlar. Bu nedenle, giriş matrisi, dilinizin destekleyebileceği maksimum değere kadar herhangi bir boyutta olabilir. Kartın nesiller arasında çıkış yapmanıza gerek yoktur.

Bu bir bu yüzden en kısa kod kazanır.

Test senaryoları

Bunlar B/S, kullanılan kuralları göstermek için gösterimi kullanır

B2/S2,, generations = 100yapılandırma:

1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

Çıktı:

0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
1 0 0 0 0 0 0 1
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

B1357/S2468,, generations = 12yapılandırma:

1 0 1 0 1 0
0 1 1 0 1 0
1 0 0 0 0 0
0 0 0 0 0 1
1 1 1 1 1 0
0 1 1 0 0 1

Çıktı:

0 1 0 0 0 0
0 1 1 1 1 0
0 1 0 1 1 0
1 1 1 0 0 0
0 0 1 1 1 0
0 1 1 0 0 0

Daha fazla test örneği oluşturmanız gerekiyorsa, bu harika simülatörü kullanabilirsiniz . Lütfen tahta boyutunu sınırladığınızdan emin olun


Simülasyon toroidal midir?
Outgolfer Erik

@EriktheOutgolfer hayır, matris (teorik olarak) sonsuz büyüklükte olduğu için
caird coinheringaahing

Ayrıca, verilen matrisin kare olduğunu varsayabilir miyiz?
Outgolfer Erik

2
@EriktheOutgolfer "sonsuz büyük kare ızgara"
caird coinheringaahing

Yanıtlar:


9

MATL , 24 23 bayt

xx:"tt3Y6Z+1Gm<8M2Gmb*+

Girişler:

  • Doğum kuralı olan dizi
  • Hayatta kalma kuralı olan dizi
  • Nesil sayısı
  • ;Satır ayırıcı olarak kullanılan ilk hücre yapılandırmalı matris .

Çevrimiçi deneyin! Veya test senaryolarına bakın: 1 , 2 .

Birkaç bayt daha için ASCII sanatındaki evrimi görebilirsiniz .

açıklama

xx      % Take two inputs implicitly: birth and survival rules. Delete them
        % (but they get copied into clipboard G)
:"      % Take third input implicitly: number of generations. Loop that many times
  tt    %   Duplicate twice. This implicitly takes the initial cell configuration
        %   as input the first time. In subsequent iterations it uses the cell 
        %   configuration from the previous iteration
  3Y6   %   Push Moore neighbourhood: [1 1 1; 1 0 1; 1 1 1]
  Z+    %   2D convolution, maintaining size
  1G    %   Push first input from clipboard G: birth rule
  m     %   Ismember: gives true for cells that fulfill the birth rule
  <     %   Less than (element-wise): a cell is born if it fulfills the birth rule
        %   *and* was dead
  8M    %   Push result of convolution again, from clipboard M
  2G    %   Push second input from clipboard G: survival rule
  m     %   Ismember: gives true for cells that fulfill the survival rule
  b     %   Bubble up the starting cell configuration
  *     %   Multiply (element-wise): a cell survives if it fulfills the survival
        %   rule *and* was alive
  +     %   Add: a cell is alive if it has been born or has survived, and those
        %   are exclusive cases. This produces the new cell configuration
        % Implicit end loop. Implicit display

Girdilerin sırasını değiştirerek bayt kaydedebilir misiniz? xxBaşında bana biraz savurgan görünüyor ...
Erik Outgolfer

@EriktheOutgolfer Nasıl olduğunu göremiyorum. İlk ikisini daha sonra birkaç kez tekrarlamak için silmeliyim (her yineleme için bir tane) ve diğer girdiler zaten örtük
Luis Mendo

Oh yani girişleri "silmek" onları bir tür giriş listesine ekler?
Outgolfer Erik

@EriktheOutgolfer Evet. MATL girişi interaktiftir, yani program önceden kaç giriş olduğunu bilmez. Burada, boş bir yığından silmek bir girdinin dolaylı olarak alınmasına neden olur. Alındıktan sonra, her bir giriş G panosuna kopyalanır ve daha sonra alınabilir.
Luis Mendo

3

Wolfram Dili (Mathematica) , 144122 bayt

CellularAutomaton[{Tr[2^#&/@Flatten@MapIndexed[2#+2-#2[[1]]&,{#2,#3},{2}]],{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},#,{{#4}}]&

Çevrimiçi deneyin!

Örnek kullanım:

%[RandomInteger[1, {10, 10}], {2, 3}, {3}, 5]

başlangıç ​​olarak 10x10 rastgele bir ızgara kullanır, 2 veya 3 komşu ile hayatta kalır, 3 komşu ile doğum yapar, 5 tekrarda arsa sonucu.


Çok kötü yerleşik sadece bir boyutlu (yanlışsam beni
düzelt

Ben 9 komşu totalist kural ile yerleşik "CellularAutomaton" kullanıyorum. Kodun çoğu hayatta kalma / doğum girişlerini bir kural numarasına dönüştürür.
Kelly Lowder

1

R , 256 bayt

function(x,B,S,r){y=cbind(0,rbind(0,x,0),0)
n=dim(y)[1]
z=c(1,n)
f=function(h){w=-1:1
b=h%%n+1
a=(h-b+1)/n+1
'if'(a%in%z|b%in%z,0,sum(x[w+b,w+a])-x[b,a])}
while(r){x=y
for(i in 1:n^2){u=f(i-1)
y[i]=u%in%B
y[i]=(y[i]&!x[i])|(x[i]&(u%in%S))}
r=r-1}
y[-z,-z]}

Çevrimiçi deneyin!

Ne yazık ki, bu umduğum gibi golf görünmüyor.

Giriş : bir R matrisi ve meydan okuma parametreleri. Çıktı : R nesillerinden sonraki matris.

Algoritma, sınırları işlemek için matrisi sıfırlarla doldurur. Daha sonra tekrarlamalı olarak: 1.) Doğum kuralını uygular ve 2.) Hayatta Kalma kuralını geçmeyen önceden var olan hücreleri öldürür. Dönerken dolgu çıkarılır.


güzel bayt sayısı!
Giuseppe

217 bayta ulaşmayı başardım ama tam olarak bir tane daha golf bulabilirsek 216, en azından bir küp olan onu alabiliriz ...
Giuseppe

1

Piton 2 , 156 149 146 bayt

lambda R,g,c:g and f(R,g-1,[[`sum(sum(l[y+y/~y:y+2])for l in c[x+x/~x:x+2])-c[x][y]`in R[c[x][y]]for y,_ in e(c)]for x,_ in e(c)])or c
e=enumerate

Çevrimiçi deneyin!

Girdi alır:

  • Rules: [birth,survial]listesi olarak kurallar string. ör. ( ['135','246'])
  • generations: int
  • configuration: 1/0veyaTrue/False

2d dizisini döndürür True/False

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.