Ошибка, связанная с использованием блока внутри блока в Ruby — массив не может быть преобразован в Fixnum (TypeError)

Это относится к проблеме Эйлера проекта № 1. Когда я запускаю этот код построчно в irb, я получаю ожидаемый ответ, но когда я запускаю его из файла .rb, он выдает ошибку «Массив не может быть преобразован в Fixnum (TypeError)»

Код:

# defines the list of integers from 'n' downto 0
def Zi (a, b) 
   (a.downto b).lazy
end

# the equation numberOfOccurances(smallestMultiple + largestMultiple)/2 gives the sum of all the multiples for a given range
# so, below, multipleCounts[i](multiples[i] + lastMultiples[i])/2 => multipleCounts[i](lastAndFirstMultipleSums[i])/2
# gives the arbitrary sum of multiples of a give number in multiples for the specified range.
def find_sum_for_each_multiple(from, to, *multiples)
   myReverseArr = Zi to, from
   lastMultiples = multiples.map { |m| myReverseArr.find { |i| i % m == 0 } }
   multipleCounts = lastMultiples.zip(multiples).map { |ms| ms.reduce(:/) }
   lastAndFirstMultipleSums = lastMultiples.zip(multiples).map { |ms| ms.reduce(:+) }
   sumsOfEachMultiple = lastAndFirstMultipleSums.zip(multipleCounts).map { |xs| xs.reduce(:*) }.map { |x| x/2 }
end

def find_sum_of_multiples(from, to, *multiples)
   sumsOfEachMultiple = find_sum_for_each_multiple(from, to, multiples)

   commonMultiples = []
   (0..(multiples.length - 1)).each do |i|
      ((i+1)..(multiples.length - 1)).each do |j|
         commonMultiples << (multiples[i] * multiples[j])
      end
   end

   sumsOfCommonMultiples = find_sum_for_each_multiple(from, to, commonMultiples)

   totalSum = (sumsOfEachMultiple.inject { |sum, x| sum + x }) - (sumsOfCommonMultiples.inject { |sum, x| sum + x })
end

puts find_sum_of_multiples(0, 999, 3, 5)

Сообщение об ошибке:

C:\Users\[User]>ruby euler1.rb
euler1.rb:11:in `%': Array can't be coerced into Fixnum (TypeError)
        from euler1.rb:11:in `block (2 levels) in find_sum_for_each_multiple'
        from euler1.rb:11:in `downto'
        from euler1.rb:11:in `each'
        from euler1.rb:11:in `each'
        from euler1.rb:11:in `find'
        from euler1.rb:11:in `block in find_sum_for_each_multiple'
        from euler1.rb:11:in `map'
        from euler1.rb:11:in `find_sum_for_each_multiple'
        from euler1.rb:18:in `find_sum_of_multiples'
        from euler1.rb:32:in `<main>'

Я работаю на 64-битной машине с ядром i7 под управлением Windows 7 с Ruby версии 2.0.0p0 (2013-02-24) [x64-mingw32]


person josiah    schedule 12.08.2013    source источник
comment
кто бы ни проголосовал за меня, не мог бы объяснить, почему за меня проголосовали? Это кажется мне законным вопросом... Если я могу выполнить один и тот же код построчно в интерпретаторе и не получить ошибок, но я получаю ошибку при запуске кода из скрипта, это будет означать, по крайней мере, для меня, что моя логика верна, но в языковой реализации есть что-то особенное, чего мне не хватает. Я немного погуглил, но не нашел ничего, что, по моему мнению, имело отношение к этой ошибке. Может ли это быть дефект интерпретатора?   -  person josiah    schedule 12.08.2013


Ответы (1)


commonMultiples уже является Array, а в find_sum_for_each_multiple он преобразуется в Array из Arrays.

Изменить эту строку

sumsOfCommonMultiples = find_sum_for_each_multiple(from, to, commonMultiples)

to

sumsOfCommonMultiples = find_sum_for_each_multiple(from, to, *commonMultiples)
person Santhosh    schedule 12.08.2013
comment
Ааа! Так что это был просто кусочек синтаксиса Ruby, которого мне не хватало. Спасибо! Это сработало для меня! - person josiah; 12.08.2013
comment
Я также хочу добавить, что я знаю, что это еще не полное решение - если вы попробуете этот метод с 3 или более кратными, он сломается, потому что вычисление сумм общих кратных еще не находит все общие кратные дублирования. Для этого, я полагаю, мне придется отредактировать код, чтобы вычислить не только суммы общих кратных всех пар (2), но также и троек (3) и т. д. до n, где n — количество кратные. Все еще как бы обдумывая это. - person josiah; 12.08.2013
comment
Я не пытался понять логику этого кода. В любом случае удачи с проблемой. :) - person Santhosh; 12.08.2013