Для ботанских развлечений некоторые языки подходят больше других. Так, например, предыдущая задача должна решаться не рубями, а немного более функциональным языком. Например, Clojure.

Как-то так:

;;; API

(first my-seq)
;; => "1"
(take 7 my-seq)
;; => ("1" "11" "21" "1211" "111221" "312211" "13112221")
(first (filter #(>= (count %) 15) my-seq))
;; => "13211311123113112211"

;;; Implementation
(defn nxt [s]
  (->> s
       (partition-by identity)
       (map #(str (count %) (first %)))
       (apply str)))

(def my-seq (iterate nxt "1"))

Наличие функции iterate и отсутствие ООПе-церемоний позволяет скукожить код в разы, улучшив при этом читаемость. В некоторых других языках тоже есть iterate.