Как заменить в руби два цикла на один?

a = [0,1,4,8,0,10,30,50,0]

b = []

zero_indexes = []

a.each_with_index do |e,i|

    zero_indexes << i if e == 0 
end

b = a.select.with_index do |e,i|

  i > zero_indexes[0] && i < zero_indexes[1]

end

p b.sum

Ответы (2 шт):

Автор решения: Nakilon

Так будет один проход, а не два.

a = [0,1,4,8,0,10,30,50,0]

b = a.drop_while{ |e| e != 0 }.
      drop(1).
      take_while{ |e| e != 0 }

p b.sum
→ Ссылка
Автор решения: MarianD

Вы можете в одном и том же цикле одновременно

  • и обнаружить, какое количество нулей вы уже встретили,
  • и на основании того добавить ненулевые элементы между первым и вторым нулем:
a = [0,1,4,8,0,10,30,50,0]

b = []

zero_count = 0

a.each do |e|
    if e == 0
       zero_count += 1
    elsif zero_count == 1
       b << e
    end
end

p b
p b.sum

Вывод:

[1, 4, 8]
13
→ Ссылка