ライフゲーム / 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にしておく。
        self.Rules  = np.array([[0,0,0,1,0,0,0,0,0], [0,0,1,1,0,0,0,0,0]], dtype="uint8") # 生死ルール排列を定義しておく。
        self.weight = np.array([[1,1,1], [1,0,1], [1,1,1]], dtype="uint8")

    def update(self):
        # この1行だけで次世代排列が求まる。
        # たとえば現世代排列が0、そのムーア近傍の和が6ならルール排列のインデックス[0,6]を検索して次世代の生死を決定する。
        self.mat = self.Rules[self.mat, convolve2d(self.mat, self.weight, mode="same", boundary="wrap")]

########
# test #
########
if __name__ == "__main__":

    # グライダーで確かめてみる。   
    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="uint8")

    life = LifeGame(glider)

    for i in range(100):
        print("第%d世代: " % (i))
        print(life.mat)
        life.update()

実行結果:
f:id:ti-nspire:20181017090326p:plain