ゲーム・オブ・ライフと疲労


10

StewieのGame of Life and Fatigueは、より有名なConwayのGame of Lifeによく似ています。


StewieのGame of Life and Fatigue(GoLF)の宇宙は、正方形のセルの無限の2次元直交グリッドであり、それぞれが生きている、死んでいる、または疲れている、3つの可能な状態の1つにあります。すべてのセルは、隣接する8つのセル(水平、垂直、または斜めに隣接するセル)と相互作用します。時間の各ステップで、次の遷移が発生します。

  • 人口が少ないことが原因であるかのように、生存細胞が2つ未満の生存細胞は死にます。
  • 2つまたは3つの生きている隣人を持つ生きている細胞は、次の世代まで生き続けます。
  • 過密状態のように、3つ以上の隣接セルを持つ生存細胞は死にます。
  • ちょうど3つの生きている隣人がいる死んだ細胞は、まるで生殖のように生きている細胞になります。
  • 2世代連続して生存していた細胞は、まるで疲労のように死にます。次世代になるまで、再び目覚めることはできません
  • 入力グリッドの境界の外側にあるセルは、崖から落ちたように死んでいます。

チャレンジ:

あなたの課題は、GoLFの初期状態を表すn行m列の次元のグリッドと整数pを取り、p世代後のゲームの状態を出力することです。

ルール:

  • 入力形式と出力形式はオプションですが、入力/出力グリッドは同じ表現でなければなりません
  • 印刷可能なシンボルを選択して、生細胞と死細胞を表すことができます(私は1生細胞と0死細胞に使用します)。
  • インデックスが0か1かを選択できます。例でp=1は、は1ステップ後の状態を意味します。
  • 各言語で最短のコードが優先されます
  • セルラーオートメーションの組み込み機能が許可されています

テストケース:

例では、pではなく、入力に入力グリッドのみを含めています。さまざまなp値の出力を提供しました。与えられた入力pに対応するグリッドのみを出力します。

Input:
0   0   0   0   0
0   0   1   0   0
0   0   1   0   0
0   0   1   0   0
0   0   0   0   0

--- Output ---
p = 1
0   0   0   0   0
0   0   0   0   0
0   1   1   1   0
0   0   0   0   0
0   0   0   0   0

p = 2
0   0   0   0   0
0   0   1   0   0
0   0   0   0   0
0   0   1   0   0
0   0   0   0   0

p = 3 -> All dead
---

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

--- Output ---
p = 1
0   0   0   0   0   0
1   0   1   0   0   0
0   1   1   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

p = 2
0   0   0   0   0   0
0   0   0   0   0   0
1   0   0   0   0   0
0   1   1   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0

p = 3
0   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   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0

p = 4 -> All dead
Input
0   1   1   0   1   1   0
1   1   0   1   1   1   1
0   1   0   0   0   1   0
0   0   0   1   1   0   1
1   0   0   1   0   1   1
0   0   1   1   0   1   1
1   1   0   0   0   0   1

--- Output ---
p = 1
1   1   1   0   0   0   1
1   0   0   1   0   0   1
1   1   0   0   0   0   0
0   0   1   1   0   0   1
0   0   0   0   0   0   0
1   0   1   1   0   0   0
0   1   1   0   0   1   1

p = 2
1   0   0   0   0   0   0
0   0   0   0   0   0   0
1   0   0   1   0   0   0
0   1   1   0   0   0   0
0   1   0   0   0   0   0
0   0   0   0   0   0   0
0   0   1   1   0   0   0   

p = 3
0   0   0   0   0   0   0
0   0   0   0   0   0   0
0   1   1   0   0   0   0
1   1   0   0   0   0   0
0   1   1   0   0   0   0
0   0   1   0   0   0   0
0   0   0   0   0   0   0

p = 4
0   0   0   0   0   0   0
0   0   0   0   0   0   0
1   1   1   0   0   0   0
1   0   0   0   0   0   0
1   0   1   0   0   0   0
0   1   1   0   0   0   0
0   0   0   0   0   0   0

p = 5
0   0   0   0   0   0   0
0   1   0   0   0   0   0
1   0   0   0   0   0   0
0   0   1   0   0   0   0
1   0   0   0   0   0   0
0   1   0   0   0   0   0
0   0   0   0   0   0   0

p = 6
0   0   0   0   0   0   0
0   0   0   0   0   0   0
0   1   0   0   0   0   0
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

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

p = 8
0   0   0   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
0   1   0   0   0   0   0
0   0   0   0   0   0   0
0   0   0   0   0   0   0

p = 9 -> All dead

はい、私はすべての最初の種がすべての細胞が死んで終わらないことを知っています。


あなたは、おそらくその遷移項目5 1--4を適用した前に、それが状態に基づいて、あるアイテム1--4、られる「同時に」が適用されるべき明確
ルイスMendo

2
" セルは、それぞれが2つの可能な状態のいずれかであり、生きているか死んでいるか "は、各セルに3つの状態(死んだ、新たに生きている、2つの連続した世代の間生きている)
ピーター・テイラー

1
誰かがそれを望んでいるなら、私はこれにゴーリールールがあります。
CalculatorFeline

6
GoDをプレイしていますか?
アダム2017年

回答:


3

MATL34 30 25バイト

@CalculatorFelineの提案により、5バイトが削除されました

0ii:"wy*~wt3Y6QZ+5:7mb*]&

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

入力は行列と数値です。マトリックスは;行セパレーターとして使用します。3つのテストケースの行列は次のように入力されます。

[0 0 0 0 0; 0 0 1 0 0; 0 0 1 0 0; 0 0 1 0 0;0 0 0 0 0]
[0 1 0 0 0 0; 0 0 1 0 0 0; 1 1 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 1 1 0 1 1 0; 1 1 0 1 1 1 1; 0 1 0 0 0 1 0; 0 0 0 1 1 0 1; 1 0 0 1 0 1 1; 0 0 1 1 0 1 1; 1 1 0 0 0 0 1]

説明

0     % Push 0. This represents the generation previous to the input one. Actually
      % This should be an array of zeros, but thanks to broadcasting it is
      % equivalent (and saves bytes)
i     % Input: array with starting generation
i     % Input: number of iterations, p.
      % STACK (bottom to top): 0, array with initial generation, p
:"    % Do the following p times
      %   STACK: previous gen, current gen
  wy  %   Swap, duplicate from below
      %   STACK: current gen, previous gen, current gen
  *~  %   Multiply element-wise, negate. This creates a mask of cells that do not 
      %   die of fatigue (they were 0 in the current or in the previous generation)
      %   STACK: current gen, fatigue mask
  wt  %   Swap, duplicate
      %   STACK: Fatigue mask, current gen, current gen
  3Y6 %   Push predefined literal: 8-neighbourhood: [1 1 1; 1 0 1; 1 1 1]
      %   STACK: Fatigue mask, current gen, current gen, 8-neighbourhood
  Q   %   Add 1 element-wise. This gives [2 2 2; 2 1 2; 2 2 2], which will be
      %   used as convolution kernel. Active cells with 2 neighbours will give 5;
      %   inactive cells with 3 neighbours will give 6; and active cells with 3
      %   neighbours will give 7
      %   STACK: Fatigue mask, current gen, current gen, convolution kernel
  Z+  %   2D convolution, keeping size
      %   STACK: Fatigue mask, current gen, convolution result
  5:7 %   Push array [5 6 7]
  m   %   Ismember, element-wise. Cells that give true will survive, unless fatigued
      %   STACK: Fatigue mask, current gen, cells that can survive
  b   %   Bubble up
      %   STACK: Current gen, cells that can survive, fatigue mask
  *   %   Multiply element-wise. This tells which cells survive considering fatigue.
      %   The result is the new generation
      %   STACK: "Current" gen which now becomes old, "new" gen which now becomes
      %   current
]     % End 
&     % Specify that implicit display will show only top of the stack

1
3Y6詳しく説明していただけますか?また、カーネルの真ん中の要素がだった場合、.5ちょうどでCGOLをチェックできます2<value<4。役立つかもしれません。
CalculatorFeline

@CalculatorFelineありがとうございます。これにより、5バイトを節約し、2倍のマスクを使用してテストしました5<=value<=7。に関しては3Y6、それは単なる事前定義されたリテラルです。1Y64つの地区であるもあります
Luis Mendo

1
ええと。それは実際に働きました。きちんと。
CalculatorFeline

3

APL(Dyalog Classic 16.0)、59バイト

⌊{((3∊⌊{⍵,⍵-c}+/,⍵)∧.1>1|c)×(.1×c)+1c2 2⌷⍵}⎕U233A 3 3⍣⎕⊢⎕

オンラインでお試しください!(Classic 15.0でエミュレート)


APL(Dyalog Unicode 16.0)、85バイト

⌊{((3∊⌊{⍵,⍵-c}+/,⍵)∧.1>1|c)×(.1×c)+1c2 2⌷⍵}⌺3 3⍣⎕⊢⎕

オンラインでお試しください!(Unicode 15.0でエミュレート)


グリッド、次にpのプロンプトを出します。p世代後に新しいグリッドを印刷します。

これは、クラシック文字セットに含まれていない新しい(ステンシル)プリミティブを使用することに注意してください。したがって、バージョンが短く、バイト数が少ないバージョンです。

従うべき説明…


APLの表示形式は素晴らしいです:-)
Luis Mendo

@LuisMendo実際、これは「APL」ではなく、インタープリターが出力したいときにこのAPL関数へのコールバックを行います。次に、関数は出力したいものを分析し、それに応じて変更します。display機能説明はこちらです。
アダム2017年

3

Golly RuleLoader、295バイト

@RULE Y
@TABLE
n_states:3
neighborhood:Moore
symmetries:permute
var z={1,2}
var y=z
var x=z
var w=z
var u=z
var a={0,z}
var b=a
var c=a
var d=a 
var e=a
var f=a
var g=a 
var h=a
0,z,y,x,0,0,0,0,0,1
z,a,0,0,0,0,0,0,0,0
z,y,x,w,u,a,b,c,d,0
2,a,b,c,d,e,f,g,h,0
1,a,b,c,d,e,f,g,h,2
@COLORS
2 255 0 0

入力グリッドは、(例えば境界がルール名であり、中に貼り付けるべきである5* 3Y:P5,3事前に、)キーを押しスペース。


2

Java 8、333バイト

int[][]G(int p,int[][]s){for(int h=s.length,w=s[0].length,y,x,n,a,b,t[][]=new int[h][w],i=0;i++<2*p;)for(y=0;y<h;++y)for(x=0;x<w;++x)if(i%2>0){for(n=0,a=y-2;++a<y+2;)for(b=x-2;++b<x+2;)n+=a>=0&a<h&b>=0&b<w&(a!=y|b!=x)&&s[a][b]>0?1:0;t[y][x]=s[y][x]<1?n==3?1:0:n<2|n>3|s[y][x]>1?0:2;}else s[y][x]=i==2*p&t[y][x]>1?1:t[y][x];return s;}

説明:

int[][]G(int p,int[][]s){
    for(int h=s.length,w=s[0].length,y,x,n,a,b,t[][]=new int[h][w],       //height, width, vars, temp array
            i=0;i++<2*p;)                                                 //for 2*generations: 1. calculate in temporary t, 2. copying to s
        for(y=0;y<h;++y)                                                  //for each row
            for(x=0;x<w;++x)                                              //for each column
                if(i%2>0){                                                //1. calculate
                    for(n=0,a=y-2;++a<y+2;)                               //n = number of alive cells around [y][x]. row above, at and below y
                        for(b=y-2;++b<y+2;)                               //column left, at and right of x
                            n+=a>=0&a<h&b>=0&b<w&(a!=y|b!=x)&&s[a][b]>0?1:0;    //if within bounds and not the cell itself, add 1 if alive.
                    t[y][x]=s[y][x]<1?n==3?1:0:n<2|n>3|s[y][x]>1?0:2;     //save next state in temporary, depending on rules. alive cells become 2.
                }
                else                                                      //2. copy temporary t to s
                    s[y][x]=i==2*p&t[y][x]>1?1:t[y][x];                   //if last generation, replace 2 by 1
    return s;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.