これは何?
できるだけ簡潔なコードで複雑(面白)な出力を得たいと思いました。
そんなときに便利なのがオートマトン。
パラメータをカオス領域において実行するだけで摩訶不思議なパターンを描いてくれます。
参考:ルール30
コード(説明付き)
# 1次元セルオートマトン
# [ルール30](https://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%BC%E3%83%AB30)
# 88 : ルール30の内部状態を左右逆にしたもの
# 135 : 状態のビットを反転したもの
# 149 : 内部状態を左右逆にし、状態のビットも反転させたもの
RULE_ID = 30 # [0, 0, 0, 1, 1, 1, 1, 0]
rule = list(map(int, f'{RULE_ID:08b}'))
N_CELL = 80 # セルサイズ
T_CNT = 100 # 実行時間
# セルの初期状態
INIT_ID = 12345678987654321 # 適当
cell_c = list(map(int, f'{INIT_ID:b}'.zfill(N_CELL)[-N_CELL:]))
for t in range(T_CNT):
print(''.join(map(lambda n:'*' if n else ' ', cell_c))) # 1を「*」で出力
# 次の状態
cell_n = []
for i in range(N_CELL):
# 隣接する3セルの状態=[0,0,0]...[1,1,1]=0...7の8通り
# 次の状態は、そのビット位置の値(0 or 1)を採用する
# セルはリング状につながっているものとする
pos = cell_c[i-1]*4 + cell_c[i]*2 + cell_c[(i+i) % N_CELL]
cell_n.append( rule[pos])
cell_c = cell_n # 状態の入替
コード(短縮版)
RULE_ID = 30 # [0, 0, 0, 1, 1, 1, 1, 0]
rule = list(map(int, f'{RULE_ID:08b}'))
N_CELL, T_CNT = 80, 100 # セルサイズ, 実行時間
INIT_ID = 12345678987654321 # 初期セル状態。適当
cell_c = list(map(int, f'{INIT_ID:b}'.zfill(N_CELL)[-N_CELL:]))
for t in range(T_CNT):
print(''.join(map(lambda n:'*' if n else ' ', cell_c))) # 1を「*」で出力
cell_n = [ rule[cell_c[i-1]*4 + cell_c[i]*2 + cell_c[(i+i) % N_CELL]] for i in range(N_CELL)] # 次の状態
cell_c = cell_n # 状態の入替
結果
* * **** *** * * * ** * * * ***** * * ** *
* * ** *** ** * * * *** * * * * ** * ****
* **** * ***** * * * * ** * * * * *** * * **
* * ** ** ** * * * **** * * * * * ** * * ***
* * ****** *** * * ** ** * * * * **** * ** **
* * ** ** * ** * **** *** * * * ** ** ******
** * *** *** **** ** *** ** * * * *** ****
*** * * ** * *** ** *** * ***** * * ** *** **
* ** * **** ** ** *** * ** ** ** * * **** ** ***
**** * * ** ******* ** ******* *** * ** ****** **
* ** * * **** ****** ** * ** **** * *****
* *** * ** ** * ** *** **** * ** * * **
* ** ** * *** *** * *** * *** ** * *** * * **
** ****** * * *** ** * * ** ** ** *** ** ** * * *
**** ** * ** ***** * **** ******* ** ****** * * *
** *** * **** ** * * ** * ****** ** * **
* *** * ** * * ** *** * * *** * * ** *** * **
** * ** **** * * *** * ** * ** ** * * *** * ** * *
*** **** * ** * ** ** **** ******* * * * ** **** * *
*** ** * *** * ******* ** * ** * * **** * ** **
* * ** *** ** ** * * ** *** * *** * * * ** * *****
** ***** ******** * * **** ** * * ** * * * *** **
**** *** ** * * * ***** * **** * * ** *****
* ** * ** *** * * * * ** * * ** * ***** **
* *** **** * ** * * * * *** * * *** * * ** ***
** ** * ** **** * * * * * ** * ** ** * * *** * **
* ****** * *** * ** * * * * **** * ****** * * * ** ***
*** ** ** ** * *** * * * ** ** ** ** * * *****
* ** ********* ** ** * * **** *** *** *** * ** **
**** * ** ****** * * * *** ** * ** * ** * *** ***
** ** * *** * ** * * * * ***** **** **** * * ** * *
** *** * * ** * *** * * * ** *** ** * ** * **** **
***** ** * **** * * ** * * **** * ** *** * *** ** ****
***** * * ** * **** * * * ** ***** ** ** ***** *
* ** * * *** * * ** * * * *** * ********* ** *
* *** * ** ** * * *** * * ** ** * * ** *** *
* * ** * ****** * ** ** * ******* * * *** * ** *
* * **** * * ** ******* * * ** * * * ** ****
* ** ** * * **** ** * * *** * * ***** **
* * *** *** * * * ** *** * * * ** * * * ** **
** * * *** ** * * * *** * ** * * **** * * * ****
*** * ** ***** * * ** ** **** * * * ** * * * * **
** * **** ** * * ****** * ** * * * *** * * * * *
*** * * ** *** * ** ** * *** * * ** ** * * * * *
* * ** * * *** * ** * *** *** ** ** * * ****** * * * *
* **** * ** ** **** ** ** * ** ****** * ** ** * * * *
* ** ** * ******* ** ****** ***** ** * *** *** * * *
**** *** ** ** **** ** * ** *** * * ** * ** * * *
** *** ***** **** ** *** * *** * ** * **** **** * *
*** * *** ** * ** *** * ** * * ** **** * * ** * ** * *
* ** ** ** *** * **** ** **** * **** * ** * * *** * *** * *
********** * ** ** ***** * ** ** ** * *** * ** ** ** ** * *
* ** **** *** * ** * ****** *** ** ** * ************ * *
* * **** ** * ** * *** ** *** ******** * * ** *
* * * ** *** **** * * ***** * *** ** * * *** *
* * * **** *** ** * ** ** ** ** *** * * * ** *
* * * ** *** ** *** **** *** ****** * ** * * ****
* * * *** * ****** *** ** * ** * ** **** * * * **
* * * * * ** ** *** ** *** **** * *** * ** * * * **
** * * * ******* * ****** *** ** * * ** * *** * * **
*** * * * * ** ** *** ** *** * **** ** ** * * ***
** * * * * *** *** * ****** ** * * ** ****** * * *
*** * * * * * ** * ** ** ***** * * *** * ** * * *
* ** * * * * **** **** *** * ** * ** ** * *** * * *
* **** * * * * * *** ** * ** * *** ******* * * ** * *
* * ** * * * * * * ** *** **** * * *** ** * **** * *
* * *** * * * * * ***** *** ** * ** ** *** * * ** * *
* ** ** * * * * ** *** ** *** ******* * ** * * *** * *
******* * * * * *** * ****** ** * ** **** * ** ** * *
* ** * * * ** ** ** ***** * *** * ** ******* * *
* * *** * * * ****** *** * ** * * ** * **** ** *
* * * ** * * * * *** ** * *** * **** ** ** *** *
* * **** * * * * * ***** * * ** * * ** *** *** * ** *
* * * ** * * * * ** ** * **** * * **** *** ** **** *
* * * *** * * * * *** *** ** ** * ** *** ***** * ** *
* * ** ** * * * * * ** * ** *** *** * *** * *** ** * *** *
* * ****** * * * * **** **** * *** ** ** ** ** ** *** ** ** *
* ** ** * * * ** *** ** ** ***** ************ * ** ****** *
* *** *** * * **** * ** ******* *** ** ***** ** *
* * ** * ** * ** ** ***** ** * ** **** ** *** *
* **** **** * *** **** ** *** **** * ** *** * ** *
* * * ** * ** ** *** ** *** * ** * ** * *** * ** ****
* * * *** * ******* ** *** * ** **** * *** ** ** **** * **
* * ** ** ** ****** ** **** * ** ** ** ******* ** * ***
* ********** * ****** ** * ********* * ** *** ** **
* * * ** * * ** *** ** ** * **** *******
** * * *** * * **** ** *** *** * * ***
*** * * * ** * * * ****** ** * ** * * * **
* ** * * **** * * * * ***** **** * * ****
**** * * * ** * * * * * ** * ** * ** **
* ** * * * *** * * * * * *** * *** * *** ***
* *** * * ** ** * * * * * * ** ** ** * * *** **
** ** * * ****** * * * * * **** ****** * ** *****
* ****** * * * ** * * * * ** ** * ** ***** *
** * ** * * * *** * * * * *** *** * *** * ** *
** * *** * * * * ** * * * * * *** ** * * ** * *** *
**** * * ** * * * **** * * * * ** ***** * **** * * **
* ** * **** * * * * ** * * * ***** ** * * ** * ****
** *** * * ** * * * * *** * * ** ** *** * * *** **
**** ** * * *** * * * ** ** * * *** *** * ** * ** ** ***