Modified my first solution to make it thread safe.

Also include the solution for finding happiest between 1 and 1,000,000.

class Integer

def digits(base = 10)

return [self] if self < base

self.divmod(base).inject { |div, mod| div.digits(base) << mod }

end

def happy?(base = 10)

_happy?([], base)

end

protected

def _happy?(happy_list, base)

return false if happy_list.include?(self)

happy_list << self

return happy_list if self == 1

self.digits(base).inject(0) { |n, d| n + d*d }._happy?(happy_list,

base)

end

end

# Find happiest between 1 and 1_000_000

# 1_000_000 is not the happiest. ( [1000000, 1] )

# So, all numbers <= 999_999 after first iteration

# will <= (9**2) * 6 ( = 486 )

# Also the rule to determine happy for number

# 123 is the same as 231, 321, 12300, 10230 … etc

# So, for all 2 digits numbers, we only need to check 55 numbers,

# for all 3 digits numbers, we only need to check 220 numbers … etc

# Here will not use this optimization, because the happiest does not

# so slow ( at least on my PC ) to find it …

if **FILE** == $0

# find all happy numbers ( max happy rank ) between 1 … (9**2)*6

rate = 1

list = [1]

max = (9**2) * 6

(1…max).each do |n|

happy = n.happy?

next unless happy

if happy.size == rate

list << n

elsif happy.size > rate

rate = happy.size

list = [n]

end

end

happiest = ((max+1)…1_000_000).each do |n|

break n if list.include?(n.digits.inject(0) { |sum, d| sum + d*d })

end

puts “the happiest number between 1 and 1,000,000 is #{happiest}”

p happiest.happy?

end