user3763875
user3763875

Reputation: 329

Repeating a loop when it reaches the end

I am trying to conceptualize the iteration of two loops

numbers_array = [1,2,3,4,5,6,7,8,9,10]
add_to_array = [1,2,3,4]

While the numbers_array iterates, add_to_array iterates simultaneously adding both elements together at the same time. The caveat is once add_to_array reaches the end, it starts over adding its element to the next index in numbers_array. So at numbers_array[4] we would be adding add_to_array[0] then adding numbers_array[5] to add_to_array[1] and so on. This process would repeat until we reach the end of the numbers_array.

Any input would be greatly appreciated!

Upvotes: 0

Views: 80

Answers (4)

iGian
iGian

Reputation: 11193

Another option:

numbers_array.map { |e| e + add_to_array.rotate!.last }

# => [2, 4, 6, 8, 6, 8, 10, 12, 10, 12]

Drawback: add_to_array is mutated by rotate!

Upvotes: 0

Cary Swoveland
Cary Swoveland

Reputation: 110675

add_to_array.zip(*numbers_array.each_slice(add_to_array.size)).
             map { |a| a.sum { |e| e.to_i } }
  #=> [16, 20, 13, 16]

e.to_i is needed to convert nil values to zeros. See NilClass#to_i.

Upvotes: 0

Aleksei Matiushkin
Aleksei Matiushkin

Reputation: 121000

You are looking for Enumerable#zip and Enumerable#cycle:

numbers_array = [1,2,3,4,5,6,7,8,9,10]
#⇒ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
add_to_array = [1,2,3,4]
#⇒ [1, 2, 3, 4]
numbers_array.zip(add_to_array.cycle)
#⇒  [[1, 1], [2, 2], [3, 3], [4, 4], [5, 1],
#    [6, 2], [7, 3], [8, 4], [9, 1], [10, 2]]

Now do whatever you want with the array returned. E.g. to reduce the zipped result summing elements, map ro Enumerable#sum:

numbers_array.zip(add_to_array.cycle).map(&:sum)
#⇒ [2, 4, 6, 8, 6, 8, 10, 12, 10, 12]

Upvotes: 8

Tallboy
Tallboy

Reputation: 13417

It works by using the % operator to cycle through the indexes.

numbers_array = [1,2,3,4,5,6,7,8,9,10]
add_to_array = [1,2,3,4]

numbers_array.map.with_index do |n, i|
  n + add_to_array[i % add_to_array.length]
end

A cool method that's similar, if you didn't want to start over at the next array, would be .zip

https://apidock.com/ruby/Array/zip

Upvotes: 0

Related Questions