game of life 3

ルール表に従って行列を書き換える。

引数は、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