なんとなくGraphvizをつかってみたくなって、簡単そうな Collatz 算法 で試してみた。
1 から指定ステップ数まで逆算したグラフを描きます。
require "rubygems" require "graphviz" level = ARGV.shift.to_i g = GraphViz.new("Collatz") def collatz(i) r = [2*i] if i % 6 == 4 r << (i-1)/ 3 end return r end seed = [1] proced = [] g.add_node(seed[0].to_s) level.times{ seed.map!{|a| collatz(a).reject{|i|proced.include?(i)}.each{|i|proced<<i; g.add_node(i.to_s);g.add_edge(a.to_s, i.to_s)}}.flatten! } g.output(:output => "jpg")
こんなかんじ。graphvizお手軽すぎてすばらしい。
使用法。
$ ruby collatz.rb 10 > collatz10.jpg
これは綺麗。手書くとどうしても均整がとれないのだけど、そこは流石専用ツール。
今度は Haskell で、 Stern-Brocot 木 でも描画させてみようかな。