email55555 email55555
9/6/2006 2:59:00 PM
Modified from Simon's solution.
This one has 3 lines longer, but it takes ~ half time compare to the origin
for finding the happiest between 1 and 100000.
-------------------------------------------------------------------
happy = Hash.new do |h, k|
digits = k.to_s.split('')
digits_sorted = digits.sort
next h[k] = h[digits_sorted.join.to_i] if digits != digits_sorted
sum = digits.inject(0) {|s, i| s + i.to_i * i.to_i}
sum != 1 ? (h[k] = 0) : (next h[k] = 1)
h[k] = (h[sum].nonzero? || -1) + 1
end
puts (1..100000).max {|a, b| happy[a] <=> happy[b]}
-------------------------------------------------------------------