ライフゲーム #27

サイズを広めに取っておいて元々動かす気満々だったわけだが、Glider編隊を飛ばしてみよう。
レンダリングパラメータの設定にはvis_alive_2.gを使う。

$ gvpr -f gen_mesh.g -a 30,20 |
> gvpr -cf set_gen0.g -a "glider.txt 26,16 glider.txt 21,16 glider.txt 16,16 glider.txt 26,11" > gliders_000.gv

$ gvpr "BEGIN{
>   int i;for(i=0;i<120;i++)
>   system(sprintf('gvpr -cf next_gen.g gliders_%03d.gv > gliders_%03d.gv',i,i+1));
> }"

$ gvpr "BEGIN{
>   int i;for(i=0;i<=120;i++)
>   system(sprintf('gvpr -cqf vis_alive_2.g -a .06 gliders_%03d.gv | neato -Nlabel=\"\" -T png -o gliders_%03d.png',i,i));
> }"

animated GIFにする時にファイルの指定がちょっと面倒なので、
sprintf関数の書式指定で%dの代わりに%03dにして世代番号を0パディングの3桁に統一した。

$ convert -loop 0 -delay 10 gliders_*.png gliders.gif

ファイル名の桁数が揃っているのでアスタリスクで一括指定ができる。

端辺にぶつかるまでは普通に移動するが、
この配置関係の場合、前に単独のGliderで示したのと同様に端辺にぶつかるとBlockになる。
が、右端の2機のGliderは上のGliderが端辺に着く前の第50世代で下のGliderの成れの果てのBlockと相互作用し、
左右対称の変化がしばらく続いた後、上下の対称性も生まれ、第108世代からPulsarと呼ばれる3世代周期の繰り返しパターンになる。