ライフゲーム #18
第0世代のalive属性を長々と設定するところをもう少し何とかしよう。
glider_gun.txt
1,23 1,24 2,23 2,24 ...snip 35,25 35,26 36,25 36,26
のようにalive属性を付与するノード名のリストを作成しておく。
このリストを読み込み、name属性がそのどれかに一致するノードにalive属性を付けるフィルタが以下である。
set_gen0.g
BEGIN { if (ARGC != 1) { printf(2, 'usage: gvpr -f set_gen0.g -a filename\n'); exit(0); } string filename = ARGV[0]; int fd = openF(filename,'r'); string p[], s; int pn = 0; for (s = readL(fd); s != ""; s = readL(fd)) { p[pn++] = substr(s, 0, length(s) - 1); } closeF(fd); } N { int i; for (p[i]) { if (name == p[i]) { alive = 1; break; } } }
BEGIN節でstring配列にリストのデータを読み込んで、
N節で各ノードのname属性と配列の各要素とを比較している。
gvpr -f gen_mesh.g -a 45,30 | gvpr -cf set_gen0.g -a glider_gun.txt > glider_gun_0.gv gvpr -cf vis_alive.g -a .1 glider_gun_0.gv | neato -Nlabel="" -T png -o glider_gun_0.png
gen_mesh.gでメッシュの雛形を作成し、
set_gen0.gでリストファイルに従ってalive属性を設定するフィルタ処理を行う。
これはリストのファイル名の通りGlider Gunのパターンである。