我正在Project Euler处理问题以获得一些Ruby经验。我现在正在处理的问题是让我查看一个1000位的数字,并查找具有最佳产品的五个连续数字的序列。
big_num = //1000-digit number
num_array = big_num.split('').map(&:to_i)
biggest = 0
prod = 1
(0..995).each do |x|
(0..4).each do |y|
prod *= num_array[x+y]
end
biggest = prod if prod > biggest
prod = 0
end
puts biggest
这给了我882,这是不正确的。为了找到问题,我让它为每次迭代打印x和y的值。在第一次迭代之后,它总是将y的五个值打印为7,3,1,6,7
,当它们全部相乘时,等于882.因此,在外部循环的第一次迭代之后,它不会超过前五个值num_array
的{{1}},即使x似乎正在递增。对于我的生活,我无法弄清楚它为什么会这样表现。
答案 0 :(得分:3)
我会使用漂亮的Enumerable方法each_cons()
来获取连续数字的所有序列,从而消除外部循环。其次,我会使用reduce(:*)
来获取每个产品,从而消除内循环。最后,我会打电话给.max
以获得答案。
num_array.each_cons(5).map{|seq| seq.reduce(:*)}.max
Voilà,单行。
答案 1 :(得分:1)
您必须使用1而不是0重新初始化prod
。