For fun, I thought I'd see what it looked like to implement the integer-based algorithm that this quiz is based on. Here's what I came up with. (I'm a big fan of monkeypatching. :) class Integer def each_digit to_s.each_byte{ |b| yield( b - ?0 ) } end def look_and_say digits, counts = [], [] each_digit{ |d| if digits.last == d counts[ counts.size - 1 ] += 1 else digits << d counts << 1 end } counts.zip( digits ).join.to_i end end n = 1 12.times{ p n; n = n.look_and_say } #=> 1 #=> 11 #=> 21 #=> 1211 #=> 111221 #=> 312211 #=> 13112221 #=> 1113213211 #=> 31131211131221 #=> 13211311123113112211 #=> 11131221133112132113212221 #=> 3113112221232112111312211312113211