3n+1まねして作ってみた

http://araistudy.g.hatena.ne.jp/czk-htn/20070612

作ってみた。

#!/usr/bin/ruby

def calc_max_len (from, to)
  calculator = lambda do |a,n| 
    return n if a == 1
    if a%2 > 0 
      a = (3*a)+1
    else
      a = a/2
    end
    calculator.call(a,n+1)  
  end

  (from..to).map {|e| calculator.call(e,1)}.max
end

from, to = ARGV.map {|e| e.to_i}
puts(calc_max_len(from,to))
__END__
$ ./3n+1.rb 1 10
20
$ ./3n+1.rb 100 200
125
$ ./3n+1.rb 201 210
89
$ ./3n+1.rb 900 1000
174

コードの内容は人によってかわるみたい。

追記

ブロックを使う必要がない場合は、「max => sort.last」の方が良いかも。
(破壊的でも良い場合は「sort!.last」)*1

*1:いや、last => [-1]でも良いけど