19 lines
546 B
Ruby
19 lines
546 B
Ruby
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
|