Это можно сделать одним из способов.
def flip(lockers, n)
h = { "closed"=>"open", "open"=>"closed" }
(0..lockers.size-1).step(n).each { |i| lockers[i] = h[lockers[i]] }
lockers
end
lockers = 6.times.map { ["open", "closed"].sample }
#=> ["open", "closed", "open", "closed", "closed", "open"]
flip(lockers, 2)
#=> ["closed", "closed", "closed", "closed", "open", "open"]
lockers
#=> ["closed", "closed", "closed", "closed", "open", "open"]
lockers = ["open", "closed", "open", "closed", "closed", "open"]
flip(lockers, 3)
#=> ["closed", "closed", "open", "open", "closed", "open"]
lockers = ["open", "closed", "open", "closed", "closed", "open"]
flip(lockers, 4)
#=> ["closed", "closed", "open", "closed", "open", "open"]
Ниже приведен другой способ.
def flip(lockers, n)
h = { "closed"=>"open", "open"=>"closed" }
lockers.map!.with_index { |s,i| (i % n).zero? ? h[s] : s }
end
Я предположил, что под «каждым другим элементом» первым будет перевёрнут первый элемент массива.(Обратите внимание, что последний элемент массива имеет индекс lockers.size-1
, а не lockers.size
.)
Я понимаю, что вы хотите изменить существующий массив, поэтому я так и сделал.Чтобы вернуть новый массив и оставить исходный массив без изменений (обычно это предпочтительный метод), просто замените map!
на map
.
См. Array # map! и Array# карта .