Вместо того, чтобы решить проблему за один раз, рассмотрение отдельных частей проблемы может помочь вам немного лучше понять рубин.
Первая часть - выяснить, каким будет номер треугольника.Поскольку здесь используется последовательность натуральных чисел, вы можете представить ее, используя диапазон в ruby.Вот пример:
(1..10).to_a => [1,2,3,4,5,6,7,8,9,10]
Массив в ruby считается перечислимым, а ruby предоставляет множество способов для перечисления данных.Используя это понятие, вы можете перебирать этот массив, используя каждый метод, и передавать блок, который суммирует числа.
sum = 0
(1..10).each do |x|
sum += x
end
sum => 55
Это также можно сделать с помощью другого перечислимого метода, известного как inject, который передаст то, что возвращается изпредыдущий элемент к текущему элементу.Используя это, вы можете получить сумму в одну строку.В этом примере я использую 1.upto (10), который будет функционально работать так же, как (1..10).
1.upto(10).inject(0) {|sum, x| sum + x} => 55
Пройдя через это, при первом вызове, sum = 0,x = 1, поэтому (sum + x) = 1. Затем он передает это следующему элементу и поэтому sum = 1, x = 2, (sum + x) = 3. Следующая сумма = 3, x = 3, (sum+ x) = 6. sum = 6, x = 4, (sum + x) = 10. И т. д. и т. д.
Это только первый шаг этой проблемы.Если вы хотите изучать язык таким образом, вам следует подходить к каждой части проблемы и изучать, что нужно изучать для этой части, а не решать всю проблему.
РЕФАКТИВНОЕ РЕШЕНИЕ (хотя и неэффективное ввсе)
def factors(n)
(1..n).select{|x| n % x == 0}
end
def triangle(n)
(n * (n + 1)) / 2
end
n = 2
until factors(triangle(n)).size >= 500
puts n
n += 1
end
puts triangle(n)