I'm just posting my happy? method since it's a little different from
the others. I opted for a recursive solution that records its results
as it goes. I set the cache value to false before recursing; if the
number winds up being happy, the true values are set as the recursion
unwinds.

  class Integer

    # cache of happy true/false by number
    @@happy = Hash.new

    # sum of squares of digits
    def sosqod
      sum = 0
      self.to_s.each_byte { |d| d -= ?0; sum += d * d }
      sum
    end

    # am I a happy number?
    def happy?
      return true if self == 1
      return @@happy[self] if @@happy.include?(self)
      @@happy[self] = false
      @@happy[self] = self.sosqod.happy?
    end

  end