Вместо того, чтобы решать проблему за один раз, просмотр отдельных частей проблемы может помочь вам немного лучше понять Ruby.
Первая часть — выяснить, каким будет число треугольника. Поскольку здесь используется последовательность натуральных чисел, вы можете представить это с помощью диапазона в ruby. Вот пример:
(1..10).to_a => [1,2,3,4,5,6,7,8,9,10]
Массив в ruby считается перечисляемым, а ruby предоставляет множество способов перечисления данных. Используя это понятие, вы можете перебирать этот массив с помощью метода each и передавать блок, который суммирует числа.
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
Проходя через это, первый раз, когда это вызывается, сумма = 0, х = 1, поэтому (сумма + х) = 1. Затем он передает это следующему элементу, и поэтому сумма = 1, х = 2, (сумма + х ) = 3. Следующая сумма = 3, x = 3, (сумма + x) = 6. сумма = 6, x = 4, (сумма + 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)
person
lambdabutz
schedule
11.06.2010
->
? Это какой-то экшен 1.9, о котором я ничего не знаю? - person theIV   schedule 11.06.2010->num{ (num *(num + 1)) / 2 }
- person Jörg W Mittag   schedule 11.06.2010