Collatz問題 #10

前出のグラフのノード数はGraphvizのコマンドgcを使って、

$ ./collatz6 | gc -n
      62 %1 (<stdin>)

であり100に満たない。つまり100以下の値を含むすべての経路が表現されていない。
一旦100を超える値を経由して戻ってくるような経路があるが、
芋づる式の方法でかつシンプルな打ち切り方をしているのでこれは仕方がない。
このグラフには値が100を超えるノードも含まれるので正確な100以下のノードの数は、

$ ./collatz6 | gvpr 'BEG_G{int s=0;} N[name<=100]{s++;} END_G{print(s, " ", name, " (", $F, ")");}'
49 %1 (<stdin>)

と、Graphvizのコマンドgvprのワンライナで数えられる。
N節のアクション中のnameはノードのラベル、END_G節のnameはグラフの名前であることに注意。
このグラフの場合、全ノードのうち値が100を超えるノードだけが入力エッジ数0なので、

$ ./collatz6 | gvpr "BEG_G{int s=0;} N[indegree>0]{s++;} END_G{print(s);}"
49

でも同じく49を得ることができるが素直でないと思う。