1

配列の配列 (つまり、行列) の行または列を交換したいと考えています。この swap メソッドをオンラインで見つけ、自分のmutate関数で拡張しました。ここで、board.matrixは配列の配列です。

# Swap to elements of an Array
def swap!(a,b)
  self[a], self[b] = self[b], self[a]
  self
end

def mutate(board)
  matrix = board.matrix
  random = rand
  rand_a = rand(matrix.length-1)
  rand_b = rand(matrix.length-1)

  puts "Old one:"
  board.print_matrix
  # We have a 50:50 chance of swapping either columns or rows
  if random <= 0.5
    # Swap columns: Transpose first
    puts "Swapping columns #{rand_a} and #{rand_b}..."
    temp = matrix.transpose
    temp.swap!(rand_a, rand_b)
    matrix = temp.transpose
  else
    # Just swap rows
    puts "Swapping rows #{rand_a} and #{rand_b}..."
    matrix.swap!(rand_a, rand_b)
  end
  puts "New one:"
  board.print_matrix
end

これで、行に対して行うべきことが行われます。

Old one:
X  X  0  0  
0  0  0  0  
X  X  0  0  
0  0  0  0  

Swapping rows 1 and 0...
New one:
0  0  0  0  
X  X  0  0  
X  X  0  0  
0  0  0  0

しかし、それは列ではありません。何故ですか?

Old one:
0  X  X  0  
0  0  X  0  
X  0  0  0  
0  0  0  0  

Swapping columns 1 and 0...
New one:
0  X  X  0  
0  0  X  0  
X  0  0  0  
0  0  0  0
4

2 に答える 2

2

次のコードでは、Arraymatrixが指している変換を行っていないためmatrix、ローカル変数である に新しい Array を割り当てただけです。

temp = matrix.transpose
temp.swap!(rand_a, rand_b)
matrix = temp.transpose

実際にこのコードを次のように置き換えることができます:

matrix.each do |row|
    row[rand_a], row[rand_b] = row[rand_b], row[rand_a]
end
于 2011-01-30T20:32:12.867 に答える
2

問題は、ローカル変数matrixを によって作成された新しいオブジェクトにのみ設定することです#transpose

次に、元の行列オブジェクトを印刷しましたが、これは明らかにboard.matrix.

行を交換するためにローカル変数も使用しましたが、その場合、ローカルは元のオブジェクトへの参照であるため、それらは同じであり、出力ルーチンの観点から「機能」しました。しかし、列を使用すると、新しいオブジェクトが返されtransposeboard更新されませんでした。

于 2011-01-30T20:35:49.497 に答える