Collatz問題 #16

値9232のノードがどの開始ノードからの経路上にあるのかを見る。

collatz10.g
BEGIN {
  if (ARGC != 1) {
    print("usage: gvpr -f collatz10.g -a <node_name>");
    exit(1);
  }
}

N [name == ARGV[0]] {
  graph_t g = graph("", "D"), h = graph("", "N");
  aset(clone(g, $), "peripheries", "2");
  node(h, $.name);
  node_t n;
  edge_t e;
  while (1) {
    n = fstnode(h);
    if (n == NULL) break;
    e = fstin(node($G, n.name));
    delete(h, n);
    if (e == NULL) continue;
    if (e.tail.name != 1) node(h, e.tail.name);
    clone(g, e);
    e = nxtin(e);
    if (e != NULL) {
      if (e.tail.name != 1) node(h, e.tail.name);
      clone(g, e);
    }
  }
  write(g);
  exit(0);
}

END {
  printf(2, "node <%s> is not found\n", ARGV[0]);
}

collatz10.gは引数で与えられたノードより上流のグラフを抜き出すgvprプログラムである。

$ ./collatz9 | tred 2> /dev/null | gvpr -fcollatz10.g -a9232 | gvpr 'N[indegree==0]{print(fstout($));}'
126->63
164->82
108->54
194->97

したがって、9232のノードは194->97から始まる最長経路上にあることが分かる。

tred 2> /dev/null

ではtredで出る警告を捨てるために標準エラーをナルデバイスに捨てている。
Windowsであればnulに捨てればいい。