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; }
のように抜き出しグラフが得られるが、
さすがにここまで長いワンライナは見難いと思う。