Ruby: хеширование с параллельными циклами - PullRequest
0 голосов
/ 03 декабря 2011

Скажем, у меня есть массив:

array = [6, 6, 6, 4, 4, 6, 4, 4]

, и у меня есть еще один массив строк:

quadrant = ["upper_left", "upper_right", "lower_left", "lower_right"]

, и у меня есть массив 8 x 8, состоящий из местоположений на плате(@board), которые являются объектами nil или Checker.

Моя цель - создать хэш, такой:

hash = { "upper_left" => @board[array[0]][array[1]] ,
         "upper_right" => @board[array[2]][array[3]] ,
         "lower_left" => @board[array[4]][array[5]] ,
         "lower_left" => @board[array[6]][array[7]] }

У меня есть следующий код:

jump_positions = {}
QUADRANTS.each do |quad|
        array.each_slice(2) do |coord|
          jump_positions[quad] = @board[coord[0]][coord[1]]
        end

А затем проверка:

it "should assign board locations as adjacent positions and deliver that info as a whole" do
    @bs.board = board.create_board
    x_coord = 3
    y_coord = 1
    jump_assignments = @bs.assign_adjacent_positions(x_coord, y_coord)
    jump_assignments["upper_left"].class.should == nil
    jump_assignments["upper_right"].class.should == nil
    jump_assignments["lower_left"].class.should == Checker
    jump_assignments["lower_right"].class.should == Checker 
end

завершается неудачей, потому что все назначения относятся к классу 'Checker' и выясняется, что все они являются одним и тем же объектом 'Checker'.Я знаю, что это происходит потому, что циклы вложены так, что все 'quad' ключи инициализируются до последнего расположения платы.

Есть ли способ, которым я могу присвоить значение ключу со значением из 'массив 'за один проход, чтобы они были назначены правильно?Имеет ли этот вопрос смысл?

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Я думаю, вам просто нужно добавить немного map к моему ответу на ваш другой похожий вопрос :

hash = Hash[quadrant.zip(array.each_slice(2).map { |a| @board[a.first][a.last] })]

Учитывая такую ​​доску:

@board = [
    ['11', '12', ... '18'],
    ['21', '22', ... '28'],
    ...
    ['81', '82', ... '88']
]

вышеупомянутая конструкция дает мне hash вот так:

{
    "upper_left"  => "77",
    "upper_right" => "75",
    "lower_left"  => "57",
    "lower_right" => "55"
}

и это, похоже, то, что вы ищете.

0 голосов
/ 05 декабря 2011

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

def deltas_to_board_locations(deltas, x, y)
    board_coords = []
    deltas.each_slice(2) do |slice|
      board_coords << x + slice[0] 
      board_coords << y + slice[1]
    end
    board_coords
  end    

  def assign_adjacent_board_coords(x, y) 
    jump_positions = Hash[QUADRANTS.zip(deltas_to_board_locations(normal_deltas, x, y).each_slice(2))]    
  end

  def determine_adjacent_positions_content(board, board_coords)
    adjacent_content = {}
    board_coords.each_pair { |quad, coords| adjacent_content[quad] = board[coords[0]][coords[1]] }
    adjacent_content
  end  

, что получилось довольно неплохо.

...