ライフゲーム

ライフゲーム / Python / numpy.convolve() でムーア近傍の和を求める

scipy.signal.convolve2d()は使わずにnumpy.convolve()でムーア近傍の和を求めてみる。numpy.convolve()は1次元にしか使えないので次のように計算する。 import numpy as np from scipy.signal import convolve2d def moore(mat): # 現世代排列を取り込んで…

ライフゲーム / Python / scipy.signal.convolve2d()版

描画の更新が遅いという難点はあるが現時点で固めておく。 import numpy as np import matplotlib.pyplot as plt from scipy.signal import convolve2d from matplotlib.animation import FuncAnimation class LifeGame: # 引数は左から(2次元排列, (表示領…

ライフゲーム / Python / 時々刻々変化する2次元排列をアニメ化する

matplotlib.animation.FuncAnimation()を使ってみる。下の例はライフゲームではない。 #%matplotlib nbagg import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # この函数を一定時間ごとに繰り返し実行す…

ライフゲーム / Python / 生死排列の表現 / 散布図として表示する

import numpy as np import matplotlib.pyplot as plt # この生死排列を表示してみる。 glider = np.array([[0,0,0,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,1,0,0,0], [0,1,1,1,0,0,0], [0,0,0,0,0,0,0]], dtype=np.uint8) numOfRows, numOfCols = glider.shape …

ライフゲーム / Python / 生死排列の表現 / 画像として表示する

基本的にはmatplotlib.pyplot.imshow(2次元排列)の1行だけでよい。 import numpy as np import matplotlib.pyplot as plt # この生死排列を表示してみる。 glider = np.array([[0,0,0,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,1,0,0,0], [0,1,1,1,0,0,0], [0,0,0,…

ライフゲーム / 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 : :©上端行を下端行の下に挿…