Collatz問題 #14

collatz8とcollatz9の出力の違いについて、
82, 88, 100のノード周辺だけをピックアップしてみる。

parts.g
BEG_G {
  int i;
  graph_t g = graph($.name, "D");
}
E {
  for (i = 0; i < ARGC; i++) {
    if (head.name == ARGV[i] || tail.name == ARGV[i]) {
      clone(g, $);
      break;
    }
  }
}
END_G {
  $O = g;
}

エッジの両端のどちらかのノードの値が引数で与えられた値のどれかに等しい時、
そのエッジをクローンして出力用のグラフに追加する。

$ ./collatz8 | tred | gvpr -a"82 88 100" -fparts.g | dot -Tpng -oparts8.png

$ ./collatz9 | tred | gvpr -a"82 88 100" -fparts.g | dot -Tpng -oparts9.png


これがcollatz9で開始ノードが3個増えた部分である。
collatz9の出力については82, 88, 100を明示的に与えなくても、
これらのノードをリストアップしたワンライナの応用で、

$ ./collatz9 | tred | gvpr 'BEG_G{graph_t g=graph($.name,"D");} E[tail.name>100&&tail.indegree==0&&head.indegree==2]{edge_t e=fstin(head);clone(g,e);clone(g,nxtin(e));clone(g,fstout(head));} END_G{$O=g;}'
warning: %1 has cycle(s), transitive reduction not unique
cycle involves edge 2 -> 1
digraph {
        edge [color=blue];
        27 -> 82         [color=red];
        82 -> 41;
        164 -> 82;
        29 -> 88         [color=red];
        88 -> 44;
        176 -> 88;
        33 -> 100        [color=red];
        100 -> 50;
        200 -> 100;
}

のように抜き出しグラフが得られるが、
さすがにここまで長いワンライナは見難いと思う。