ルール表に従って行列を書き換える。
引数は、n 世代行列(mat)とルール行列(mat_rule)。
返値は、n + 1 世代行列。
ルール表:
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 現在死セルの次の状態 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 現在生セルの次の状態 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ムーア近傍の合計値 |
グライダーの例:
ペンタデカスロンの例:
数字のままだと何が何だかわからない。
Define game_of_life(mat,mat_rule)= Func :©matからmat_torusをつくる。 :Local rdim,cdim,mat_top,mat_bottom,mat_temp,mat_left,mat_right,mat_torus,r,c,temp,mat_moore,mat :rdim:=rowDim(mat) :cdim:=colDim(mat) :mat_top:=mat[1] :mat_bottom:=mat[rdim] :mat_temp:=colAugment(colAugment(mat_bottom,mat),mat_top) :rdim:=rowDim(mat_temp) :cdim:=colDim(mat_temp) :mat_left:=subMat(mat_temp,1,1,rdim,1) :mat_right:=subMat(mat_temp,1,cdim,rdim,cdim) :mat_torus:=augment(augment(mat_right,mat_temp),mat_left) : :©mat_torusからmat_mooreをつくる。 :mat_temp:=mat_torus :rdim:=rowDim(mat_torus) :cdim:=colDim(mat_torus) :For r,2,rdim-1,1 : For c,2,cdim-1,1 : temp:=subMat(mat_torus,r-1,c-1,r+1,c+1) : temp:=mat▶list(temp) : mat_temp[r,c]:=sum(temp)-mat_torus[r,c] : EndFor :EndFor :mat_moore:=subMat(mat_temp,2,2,rdim-1,cdim-1) : :©次世代のmatをつくる。 :rdim:=rowDim(mat_moore) :cdim:=colDim(mat_moore) :For r,1,rdim,1 : For c,1,cdim,1 : mat[r,c]:=mat_rule[mat[r,c]+1,mat_moore[r,c]+1] : EndFor :EndFor :Return mat :EndFunc