RosettaCodeData/Task/Happy-numbers/Ruby/happy-numbers-1.rb

20 lines
546 B
Ruby
Raw Permalink Normal View History

2013-04-10 21:29:02 -07:00
require 'set' # Set: Fast array lookup / Simple existence hash
@seen_numbers = Set.new
@happy_numbers = Set.new
def happy?(n)
return true if n == 1 # Base case
return @happy_numbers.include?(n) if @seen_numbers.include?(n) # Use performance cache, and stop unhappy cycles
@seen_numbers << n
digit_squared_sum = n.to_s.each_char.inject(0) { |sum, c| sum + c.to_i**2 } # In Rails: n.to_s.each_char.sum { c.to_i**2 }
if happy?(digit_squared_sum)
@happy_numbers << n
true # Return true
else
false # Return false
end
end