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]

気持ち悪さ重視ですから,効率とかアルゴリズムの美しさとかRubyの正しさだとかは,宇宙の彼方.

みじかく

言い換えれば,気持ち悪いのその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文字.


トラバは別に飛ばさないで良いやぁ.さぁて,レポートするべ.