ルール行列と発火セルの数とをもとに現世代行列を次世代行列に書き換える。
上から順に「lua に読み込んだ現世代行列」「lua に読み込んだ、発火セルの数」「lua から返された次世代行列」。
-- nspire 側で用意した行列を lua に読み込む。 local mat = var.recall("mat") local matCount = var.recall("matcount") -- ルール行列を定義する。 local matRule = {{0,0,0,0,0,0,0,0,0}, {1,2,2,2,2,3,3,3,3}, {2,3,3,4,4,5,5,5,5}, {3,4,4,5,5,5,5,5,5}, {4,5,5,5,5,5,5,5,5}, {6,6,6,6,6,6,6,6,6,6}, {7,7,7,7,7,7,7,7,7,7}, {8,8,8,8,8,8,8,8,8,8}, {9,9,9,9,9,9,9,9,9,9}, {9,9,9,9,9,9,9,9,9}} -- できた行列を確認する。 function on.paint(gc) local temp = matNext(mat, matCount, matRule) drawMat(temp , 0, 0, 15, 7, gc) end -- カウント行列とルール行列とに従って現世代行列を書き換える部分函数(現世代行列, カウント行列, ルール行列) function matNext(matNow, matCount, matRule) -- 返すための空行列を作る。 local matNext = newMat(#matNow, #matNow[1]) -- 次世代行列を作る。 for r = 1, #matNow do for c = 1, #matNow[1] do matNext[r][c] = matRule[matNow[r][c] + 1][matCount[r][c] + 1] end end -- 出来た次世代行列を返す。 return matNext end -- 空行列函数(行数, 列数) function newMat(rowDim, colDim) local mat = {} for r = 1, rowDim do mat[r] = {} for c = 1, colDim do mat[r][c] = 0 end end return mat end -- 行列表示函数、(穴なし行列, 原点座標, 1 辺の長さ, フォントサイズ, gc) function drawMat(mat, x0, y0, sideLen, fontSize, gc) for r = 1, table.maxn(mat) do for c = 1, table.maxn(mat[r]) do gc:setFont("sansserif", "r", fontSize) gc:setColorRGB(0x000000) gc:drawString(mat[r][c], x0 + (c - 1) * sideLen, y0 + (r - 1) * sideLen, "top") end end end