Нужна помощь в переборе массива и внесении условных изменений - PullRequest
0 голосов
/ 10 июня 2019

Я хотел бы сгенерировать массив, затем пройти его несколько раз, внося изменения в элементы в массиве в зависимости от их состояния. У меня проблемы с настройкой операторов условия для правильной работы

lockers = Array.new(900, "Closed");

#walk through and change every other item to "closed" if it is "open", and 
"open" if it is "closed
(1...lockers.size).step(2).each { |i| 
if lockers[i] = "Open"
lockers[i] = "Closed";

elsif (lockers[i] = "Closed")
lockers[i] = "Open";
end

lockers.join };


#walk through and change every 3rd item to "closed" if it is "open", and 
"open" if it is "closed
(0...lockers.size).step(3).each { |i| 
if (lockers[i] = "Open")
lockers[i] = "Closed";

elsif (lockers[i] = "Closed")
lockers[i] = "Open";
end

lockers.join; };

#walk through and change every 4th item to "closed" if it is "open", and "open" if it is "closed
(0...lockers.size).step(4).each { |i| 
if (lockers[i] = "Open")
lockers[i] = "Closed";

elsif (lockers[i] = "Closed")
lockers[i] = "Open";
end

lockers.join; };

Выполнение вышеизложенного приводит к правильному созданию массива со всем, установленным в «Закрыто» После первого прохода он не может изменить ни один из пунктов на «Открыть».

Если я изменю условное на "lockers [i] =" Open "", то, очевидно, это работает. Но затем более поздние условия также не могут подобрать каждый элемент, который должен быть.

1 Ответ

1 голос
/ 11 июня 2019

Это можно сделать одним из способов.

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# карта .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...