人生のルールを変える


15

リアルなセルラーオートマトンは、コンウェイのゲームオブライフに似たセルラーオートマトンであり、(理論的に)無限大の正方形グリッドで動作します。 。

ただし、これらのLike-likeバージョンは重要な点で異なります。特定のセルが生き残るためのルールと、特定のセルが次世代に生き残るためのルールです。

たとえば、古典的なGame of Lifeはルールを使用しますB3/S23。つまり、新しいセルを生成するには3つの生きたセルが必要であり、生き残るには2つまたは3つの生きている隣人が必要です。この挑戦のために、我々は隣人がそれ自身を含まないので、各セルがちょうど8つの隣人を持っていると仮定します。

タスクには、開始構成、出生ルール、生存ルール、および正の整数(実行する世代数)が与えられ、可能な限り短いコードで指定された世代数のルールを使用して、Life-likeオートマトンをシミュレートします。最初の構成は、正方行列/ 2次元配列または複数行の文字列になりますが、選択できます。その他は、合理的な形式と方法で提供されます。

たとえば、出生規則が12345678(任意の生きている隣人)である場合、生存規則は2357あり、開始構成は

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

次の2世代は

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

与えられた世代数が10だった場合、出力は次の行に沿ったものになります。

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

入力行列で指定された範囲外で発生する変更を処理する必要はありませんが、行列外のすべてのセルは死んでいます。したがって、入力マトリックスは、言語がサポートできる最大値まで、任意のサイズにすることができます。世代間でボードを出力する必要はありません。

これはので、最短のコードが優先されます。

テストケース

これらは、B/S使用される規則を示すために表記法を使用します

B2/S2generations = 100構成:

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

出力:

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/S2468generations = 12構成:

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

出力:

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

さらにテストケースを生成する必要がある場合は、この素晴らしいシミュレータを使用できます。ボードサイズを制限してください


シミュレーションはトロイダルですか?
エリックアウトゴルファー

@EriktheOutgolferいいえ、マトリックスのサイズは(理論的には)無限大であるため
共謀

また、与えられた行列が正方であると仮定できますか?
エリックアウトゴルファー

2
@EriktheOutgolfer 「無限に大きい正方形グリッド」
コイナーリンガーアーイング

しかし、それはあなたがその...意志の編集をとることができると言っていません。
エリックOutgolfer

回答:


9

MATL24 23バイト

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

入力は次のとおりです。

  • 出生規則のある配列
  • 生存規則を持つ配列
  • 世代数
  • ;行セパレーターとして使用する、初期セル構成のマトリックス。

オンラインでお試しください!あるいは、テストケースを参照してください: 1 2

あと数バイト、ASCIIアートの進化を見ることができます

説明

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

入力の順序を変更してバイトを節約できますか?xx開始時には、私には少しの無駄だ...
エリックOutgolfer

@EriktheOutgolferどうしてかわかりません。最初の2つを削除して後で何度も再利用する必要があります(反復ごとに1つ)。他の入力はすでに暗黙的です
ルイスMendo

ああ、入力を「削除」すると、何らかの入力リストに追加されますか?
エリックアウトゴルファー

@EriktheOutgolferはい。MATL入力はインタラクティブです。つまり、プログラムは入力の数を事前に知りません。ここでは、空のスタックから削除すると、入力が暗黙的に取得されます。一度取得すると、各入力はクリップボードGにコピーされ、後で取得できます。
ルイスメンドー

3

Wolfram言語(Mathematica)144 122バイト

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}}]&

オンラインでお試しください!

使用例:

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

10x10のランダムグリッドを開始点として使用し、2つまたは3つの近傍で生き残り、3つの近傍で誕生し、5回の反復で結果をプロットします。


組み込みが1次元にすぎない(間違っている場合は修正してください)
ザカリー

組み込みの「CellularAutomaton」と9近傍の合計ルールを使用しています。コードの多くは、生存/出生の入力をルール番号に変換します。
ケリーロウダー

1

R、256バイト

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]}

オンラインでお試しください!

悲しいことに、これは私が期待したほどゴルフのようには見えません。

入力:R行列、およびチャレンジパラメーター。出力:R世代後の行列。

アルゴリズムは、境界を処理するために行列にゼロを埋め込みます。その後、繰り返し:1)誕生ルールを適用し、2)生存ルールに合格しなかった既存の細胞を殺します。戻るときにパディングが削除されます。


素敵なバイト数!
ジュゼッペ

私はなんとか217バイトに達しましたが、もう1つゴルフを見つけることができれば216、少なくとも1つのキューブに到達できます
ジュゼッペ

1

パイソン2156の 149 146バイト

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

オンラインでお試しください!

入力を受け取ります:

  • Rules:の[birth,survial]リストとしてのルールstring。例(['135','246']
  • gエナレーション: int
  • configuration:1/0またはの正方形2D配列True/False

の2D配列を返します True/False

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.