ライフゲーム

ライフゲーム / Python / 1世代だけ進める函数

実質1行だけで現世代から次世代へ変換できる。 import numpy as np from scipy.signal import convolve2d class LifeGame: def __init__(self, mat): self.mat = np.asarray(mat, dtype="uint8") # 現世代排列を取り込んで、念のためndarrayにしておく。 sel…

ライフゲーム / Python / 全セルのムーア近傍の和を求める / scipy.signal.convolve2d()

scipy.signal.convolve2d()のboundary=オプションで境界条件を指定すればわざわざ一回り大きい排列を作る必要はなかった。 import numpy as np from scipy.signal import convolve2d # この排列aを現世代排列とする。 numOfRows, numOfCols = 5, 10 a = np.r…

ライフゲーム / Python / 全セルのムーア近傍の和を求める / scipy.signal.convolve()

畳み込み演算の函数がいろいろあるのでそれを利用する。ここではscipy.signal.convolve()を使ってみる。 import numpy as np from scipy.signal import convolve def toTorus(mat, matTorused): mat = np.array(mat , dtype="uint8") matTorused = np.array(…

ライフゲーム / Python / 2次元排列をトーラス接続にする / 上下左右にスタックする方法と一回り大きい排列に上書きする方法と

import numpy as np # この排列をトーラス接続にする numOfRows, numOfCol = 3, 5 a = np.arange(numOfRows * numOfCol).reshape(numOfRows, numOfCol).astype("uint16") # 上下左右をそれぞれスタックし合う方法 def toTorus1(mat): mat = np.array(mat) ma…

game of life 9 of 9

ライフ・ゲームの初代行列をフリーハンドで設定する。 local n = 1 -- 世代番号の初期値 local stringPen = "PEN UP" local stringEraser = "ERASER UP" local posX, posY = 0, 0 local posC, posR = 1, 1 local penDown = false local eraserDown = false l…

game of life 8

初代行列をフリーハンドで設定する。 local stringPen = "PEN UP" local stringEraser = "ERASER UP" local posX, posY = 0, 0 local posC, posR = 1, 1 local penDown = false local eraserDown = false -- 行列のサイズを決める。 local rdim, cdim = 7, 7…

game of life 7

212 行 × 212 列: -- 世代番号の初期値 local n = 1 -- セルの一辺の長さを決める。 local sideLen = 1 -- ここに初代行列を入れる。 local mat_now = -- 例: --[[ {{1,1,1}, {1,1,1}, {1,1,1}} --]] --行数、列数を取得する。 local rdim, cdim = #mat_no…

game of life 6

計算手順は変えずに lua だけで実装した。 エミュレーターではかなり速くなったがハンドヘルドではあいかわらず遅い。 100 行 × 100 列(初代行列はここから拝借した): 106 行 × 159 列(初代行列は乱数): 212 行 × 318 列(ハンドヘルド・ビューの 1 画…

game of life 5

nspire で作ったユーザー定義函数と lua とを組み合わせる。 エミュレーターでわずか 23 行 × 35 列を 1 世代を更新するのに 0.1 秒もかかっている。 ハンドヘルド本体では遅すぎて使いものにならない。 こんなアルゴリズムではだめだということである。 Def…

game of life 4

行列の要素の値が 1 だったらその位置に色を塗る。行列は nspire の乱数函数で用意した。 local sideLen = 10 local mat = var.recall("mat") function on.paint(gc) for r = 1, #mat do for c = 1, #mat[1] do if mat[r][c] == 1 then gc:fillRect((c - 1) …

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 ムーア近傍の合計値 グ…

game of life 2

最外周以外のすべてのセルのムーア近傍(Moore neighborhood)の和を求める。 最外周のセルを削除してから返す。 Define moore_sum(mat_torus)= Func :©最外周以外のすべてのセルのムーア近傍の和を求める。 :Local rdim,cdim,mat_temp,r,c,temp : :©ムーア…

game of life 1

境界条件は周期境界条件(torus)とする。 以下のプログラムで上下左右のセルをコピーし合う。 Define conv_to_torus(mat)= Func :©行列の上下左右をつなぐ。 :Local rdim,cdim,mat_top,mat_bottom,mat_temp,mat_left,mat_right : :©上端行を下端行の下に挿…