ライフゲーム #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のパターンである。