Collatz予想
キミならどう書く 2.0 - ROUND 2 - — Lightweight Language Ringです.Round 2ということで,とりあえずRubyでやりました.すげぇありきたりだけど.
まずは
def g(n) return 2 if n == 1 return g(n / 2) + 1 if n % 2 == 0 return g(3 * n + 1) + 1 end def h(n) k = 0 (1 .. n).each do |e| k = e if k < g e end return k end p h(100) => $ ruby collatz1.rb 97
とりあえず何も考えずに.h(n)の求め方がアレな感じしますが,答があってりゃ良いじゃない.
気持ち悪いの
気持ち悪いのを一発.
def g count = 1 return f = lambda { |n| count += 1 return count if n == 1 return f[n / 2] if n % 2 == 0 return f[3 * n + 1] } end def h(n) ks = (1 .. n).to_a.map do |e| g[e] end return (ks.zip((1 .. n).to_a)).max end p h(100) => $ ruby collatz2.rb [120, 97]
みじかく
言い換えれば,気持ち悪いのその2.
def f(n)n==1?2:f(n%2==0?n/2:3*n+1)+1 end k=(1..100).to_a p ((k.map{|e|f e}).zip k).max
86文字.
http://www.nishiohirokazu.org/blog/2006/07/python75collatz.htmlみたいに,ただ最大のステップ数を出すだけで,かつ標準出力をしないで良いのなら,
def f(n)n==1?2:f(n%2==0?n/2:3*n+1)+1 end;(1..100).map{|e|f e}.max
でいいので,これだとたったの65文字.
トラバは別に飛ばさないで良いやぁ.さぁて,レポートするべ.