def chain(n, a = []) if n <= 1 a << n elsif n.odd? chain(n * 3 + 1, a << n) else chain(n / 2, a << n) end end p chain(10) p chain(30) p (1..100).count {|n| 15 <= chain(n).size} def chain(n) loop.each_with_object([]) do |_, a| a << n break a if n <= 1 n = n.odd? ? n * 3 + 1 : n / 2 end end p chain(10) p chain(30) p (1..100).count {|n| 15 <= chain(n).size}
Standard input is empty
[10, 5, 16, 8, 4, 2, 1] [30, 15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1] 71 [10, 5, 16, 8, 4, 2, 1] [30, 15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1] 71