Had some fun recently coming up with a solution to generate any element of the Look-and-say sequence. The sequence was introduced and analyzed by John Conway. Here is an example of the sequence:

1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211, ...

The best way to explain the sequence is through examples:

1 “one one” -> 11 “two ones” -> 21 “one two, one one” -> 1211, etc

This is a sequence used by Google during interviews. They ask for a method using recursion that takes in n, where n represents the n’th element appearing in the sequence, that returns the entire sequence to that point.

For example:

foo(4)
[1, 11, 21, 1211]

Here is the solution I came up with:

def look_and_say(n, x = "1", to_return = ["1"])
  if n == 1
    return to_return.map{|i| i.to_i}
  end
 
  if n > 1
    x = get_next_element(x)
    to_return << x
    return look_and_say(n-1, x, to_return)
  end
end
 
def get_next_element(x)
  current_digit = x[0]
  count = 0
  to_return = ""

  x.chars.each do |i|
    if i == current_digit
      count += 1
    else
      to_return = "#{to_return + count.to_s + current_digit}"
      current_digit = i
      count = 1
    end
  end
  to_return = "#{to_return + count.to_s + current_digit}"
  return to_return
end