Вы можете перебрать обратный массив с индексами, а затем отменить результат Array # reverse
i % 3
используется для умножения каждого третьего элемента.
Ошибка undefined method *' for nil:NilClass (NoMethodError)
в вашем примере появляется потому, что array.length
равно 16 (элементы в массиве), но индексы начинаются с 0, поэтому последний индекс равен 15, и на первой итерации вы пытаетесь получить доступ к массиву [16], который не существует, поэтому это nil
array = [4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2]
result = array.reverse.each_with_index.map do |x, i|
(i % 3).zero? ? x * 2 : x
end.reverse
# p result
#=> [8, 2, 4, 4, 4, 2, 8, 2, 4, 4, 4, 2, 8, 2, 4, 4]
ОБНОВЛЕНИЕ: Sekalf Nroc
ответ хорош с odd?
, если вам нужно, чтобы каждый 2-й элемент умножался, но если у вас было, например, 15 элементов, вы могли видеть неожиданные результаты, поэтому reverse
все еще нужно было пройти массив назад, комбинируя эти подходы, вы можете сделать что-то вроде этого:
array = [4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 99]
p array.map.with_index { |n, i| i.odd? ? n * 2 : n } # WRONG RESULT
#=>[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 99]
p array.reverse.map.with_index { |n, i| i.even? ? n * 2 : n }.reverse
#=>[8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 198]