Я понимаю, что это древний вопрос и был классифицирован как ответ, но никто не может решить вопрос в одном блоке, ни один из них на самом деле не дает сумму четных терминов в одной строке и в одном блоке и с нет двоеточий (просто заметил, что Уэйнс решает с одной строкой, но я думал, что решение с одним блоком может быть хорошим в ответ на aroth). Вот решение, которое делает:
(1..Float::INFINITY).inject([0,1,0]){|a| if a[0]+a[1] < 4000000 then [a[1],a[0]+a[1],(a[0]+a[1]).even? ? a[2] + (a[0]+a[1]) : a[2]] else break a[2] end }
для немного более четкой версии с одной точкой с запятой.
(1..Float::INFINITY).inject([0,1,0]){|a| sum=a[0]+a[1]; if sum < 4000000 then [a[1],sum,sum.even? ? a[2] + sum : a[2]] else break a[2] end }
Полагаю, я тоже это объясню, три части информации переносятся в массиве (как a
на каждой итерации): первое число Фибоначчи, второе число Фибоначчи и сумма четных членов. Имея это в виду, я думаю, что этот код вполне понятен Ruby.
следует отметить, что это в основном то же самое, что и clems, за исключением одного блока