ライフゲーム #9

Gliderパターンの第0世代を作ってみる。

gvpr -f gen_mesh.g -a "6 6" | gvpr -c "N{if (name=='n2_2'||name=='n2_3'||name=='n3_2'||name=='n3_4'||name=='n4_2'){alive=1;}}" > glider_0.gv

gen_mesh.gが生成したものを一旦ファイルに落とし、
テキストエディタなんかでalive属性付きのノード指定を行ってもいいのだが、
ここではgvprを使って該当ノードにalive属性を付けてみた。

gvpr -c -f vis_alive.g glider_0.gv | neato -Nlabel="" -Nshape=box -Nwidth=.2 -Nheight=.2 -Ncolor=slategrey -Nfillcolor=blue -Estyle=invis -Elen=.3 -T png -o glider_0.png


うまく設定されているようである。
あとは今まで通りnext_gen.gで順番に次世代のグラフを生成すればよい。
ここでは第4世代まで求めてみよう。
たった4世代の遷移なので素直に、

gvpr -cf next_gen.g glider_0.gv > glider_1.gv
gvpr -cf next_gen.g glider_1.gv > glider_2.gv
gvpr -cf next_gen.g glider_2.gv > glider_3.gv
gvpr -cf next_gen.g glider_3.gv > glider_4.gv

でもいいが、もっと多くの世代が必要になったときのために、bashなら、

$ for i in {0..3};do
>   gvpr -cf next_gen.g glider_$i.gv > glider_$(($i+1)).gv;
> done

で同じことができる。
cmdでは連番の生成はfor /lを使ってbashと同じようにできる。
1を加算することに関してはset /aを使うことになるだろうが、
forのdo以下のコマンド本体でそれを行うのは環境変数の遅延評価の問題に出会うことになる。
記述量が多くなるならバッチファイルを作成すればいいと思うが、
それを作成することなく一期一会的にコマンドラインで打ち込むにはどうすればいいのだろうか。
それはさておき、できたDOTをPNGにしてみる。

$ for i in {0..4};do
>   gvpr -c -f vis_alive.g glider_$i.gv | neato ...snip... -T png -o glider_$i.png;
> done

neatoに与えるグラフ関係のパラメータオプションは上でglider_0.pngを作成したときと同じなのでチョッキン*1
こちらは変数 i を使って1多い数を作る演算が必要ないのでcmdでもあまり悩まずに同じ動作をするものを打てる。

C:\foo> FOR /L %i IN (0,1,4) DO @gvpr -c -f vis_alive.g glider_%i.gv | neato ...snip... -T png -o glider_%i.png

これらの方法で第0世代から第4世代までのグラフを画像化した。

4世代経過すると一個左斜め下のノードにパターン全体が平行移動するというGliderの動きが再現されている。

*1:-Nlabel="" -Nshape=box -Nwidth=.2 -Nheight=.2 -Ncolor=slategrey -Nfillcolor=blue -Estyle=invis -Elen=.3