ライフゲーム #23

diehard.txtで設定されるパターンはDiehardという名前が付けられている。
第0世代でたった7個しかaliveでないのだが130世代ほど変化が続き、Methuselah*1と呼ばれるカテゴリに属する。
McClane警部補はまだ一般人な方で、Methuselahの中にはもっとずっと長く変化を続けるものが多くある。
Diehardの場合、余裕をみて第135世代まで変化を見てみよう。
gen_mesh.gでメッシュデータを作り、set_gen0.gでDiehardの第0世代のパターンを設定する。
そして、next_gen.gで次世代のグラフを作成していく、という今まで通りのパターンである。

gvpr -f gen_mesh.g -a 19,23 | gvpr -cf set_gen0.g -a diehard.txt > diehard_0.gv
gvpr "BEGIN{int i;for(i=0;i<135;i++)system(sprintf('gvpr -cf next_gen.g diehard_%d.gv > diehard_%d.gv',i,i+1));}"

次世代を次々と作成する二行目のコマンドでgvprが5回ほど警告を出す。
これは第130世代でalive属性付きのノードが消滅してしまい、
第131世代から第135世代までのそれぞれの作成時にaliveという属性を初めて見るので覚えておきますよという警告である。
こうして作成したDOTをvis_alive_2.gでフィルタしneatoで画像化する。

gvpr "BEGIN{int i;for(i=0;i<=135;i++)system(sprintf('gvpr -cqf vis_alive_2.g -a .05 diehard_%d.gv | neato -Nlabel=\"\" -T png -o diehard_%d.png',i,i));}"

vis_alive_2.gを動作させるgvprに与えるqオプションは精神衛生上重要だ。
これを付けておかないと136個の警告が出て*2非常に煩わしいと思う。こちらの警告の理由は前回述べた。
この136世代分のPNGをImageMagickのconvertでコマ間隔1/10秒のanimated GIFにする。

$ convert -loop 0 -delay 10 diehard_{?,??,???}.png diehard.gif


画像のデータ量を引き絞ったので、前のGlider Gunのような大容量にならずに済んだ。
今までの規則的な動きのパターンたちと異なり、不規則にパターンが動き回っていてこれはこれで面白い。

*1:千歳近くまで長生きした聖書中の人物

*2:実際はないがノード"0,0"がaliveであるような世代がもしあればその世代では出ない