Ради интереса я хотел бы показать более структурированный способ, используя Хэш в качестве модели для хранения информации.
Давайте использовать эти входные данные:
rooms = [110, 111, 112, 210, 211, 212].map { |n| [n, {free: true, host: nil}] }.to_h
reception_queue = %w|Kirk Picard Spock McCoy Riker LaForge|
Допустим, одна комната уже забронирована:
rooms[210] = {free: false, host: 'Uhura'}
rooms #=> {110=>{:free=>true, :host=>nil}, 111=>{:free=>true, :host=>nil}, 112=>{:free=>true, :host=>nil}, 210=>{:free=>false, :host=>"Uhura"}, 211=>{:free=>true, :host=>nil}, 212=>{:free=>true, :host=>nil}}
Теперь мы хотим назначить свободные комнаты каждому посетителю. Требуется найти первую доступную комнату, соответствующую какому-либо условию (бесплатно, но может быть одна кровать, две кровати, люкс и т.д., в зависимости от сложности модели).
Этого можно достичь с помощью Enumerable # find :
rooms.find { |_, v| v[:free] }
#=> [110, {:free=>true, :host=>nil}]
Как только мы найдем комнату, мы хотим назначить там хост, удалив ее из очереди ( Array # shift ). Прерывание цикла, если совпадения нет.
Например:
reception_queue.size.times do |person|
nr = rooms.find { |_,v| v[:free] }
break unless nr
rooms[nr[0]][:host] = reception_queue.shift
rooms[nr[0]][:free] = false
end
Таким образом, вы можете получить:
rooms #=> {110=>{:free=>false, :host=>"Kirk"}, 111=>{:free=>false, :host=>"Picard"}, 112=>{:free=>false, :host=>"Spock"}, 210=>{:free=>false, :host=>"Uhura"}, 211=>{:free=>false, :host=>"McCoy"}, 212=>{:free=>false, :host=>"Riker"}}
reception_queue #=> ["LaForge"]