Итерация по бесконечной последовательности в Ruby

Я пытаюсь решить задачу №12 проекта Эйлера:

Последовательность чисел треугольника генерируется путем сложения натуральных числа. Итак, 7-е число треугольника будет 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. Первые десять условий будут:

 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
 

Перечислим множители первых семи чисел треугольника:

  1: 1
  3: 1,3
  6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
 

Мы видим, что 28 - первое число в треугольнике, у которого больше пяти делители. Какое значение имеет первое число треугольника, чтобы было больше пяти сто делителей?

Вот решение, которое я придумал с помощью Ruby:

triangle_number = 1
(2..9_999_999_999_999_999).each do |i|
  triangle_number += i
  num_divisors = 2 # 1 and the number divide the number always so we don't iterate over the entire sequence
  (2..( i/2 + 1 )).each do |j|
    num_divisors += 1 if i % j == 0
  end
  if num_divisors == 500 then
    puts i
    break
  end
end

Я не должен использовать произвольное огромное число, например 9_999_999_999_999_999. Было бы лучше, если бы у нас была последовательность Math.INFINITY, как в некоторых функциональных языках. Как я могу сгенерировать ленивую бесконечную последовательность в Ruby?

9
задан Air 22 January 2015 в 19:16
поделиться