2015-09-16 3 views
2

Есть ли эффективный и короткий способ суммирования каждые 3 элемента массива?Суммировать каждые 3 элемента массива в ruby ​​

ar = [1, 2, 3, 4, 5, 6, 7, 8, 1] 
sum_ar = [6, 15, 16] 

первые 3 элемента 1+2+3=6
Следующие 3 элементы 4+5+6=15
Следующие 3 элементы 7+8+1=15
...
если есть осталось только два элемента, обобщать их

Я мог сделайте примерно следующее:

y=0 
s=ar.size/3 
((0..s).step(3).to_a).each do |i| 
    sum_ar[y]=ar[i..i+2].inject(:+) 
    y=y+1 
end 

, но тогда я пропущу элементы в случае такого массива, где размер не является точно умножить на 3:

ar=[1, 2, 3, 4, 5, 6, 7, 8] 

ответ

8

короткий путь с Enumerable#each_slice:

[1, 2, 3, 4].each_slice(3).map { |e| e.inject(:+) } # => [6, 4] 
+0

Это тоже замечательно, так как он возвращает новый массив. Нет необходимости иметь дополнительные шаги для вызова 'sum_arr = Array.new' – onebree

+0

еще один вопрос: как мне сопоставить каждую сумму обратно на эти 3 массива? так что мой первоначальный ar = [6,6,6,4]. Каждый элемент соответствует сумме, в которую он вносил вклад. – Tonja

+1

@Tonja: В идеале это должен быть новый вопрос, но '[1, 2, 3, 4] .each_slice (3) .flat_map {| e | Array.new (e.length, e.inject (: +))} 'является возможным решением. – cremno

Смежные вопросы