記事

Rubyで行列の回転を行いたい

ぶっちゃけまとめ

def display mat
  mat.each do |row|
    puts row.join(' ')
  end
  puts
end

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
display matrix
display matrix.reverse.transpose #=> 右回転
display matrix.transpose.reverse #=> 左回転
display matrix.reverse.map(&:reverse) #=> 180度回転

実行結果

1 2 3
4 5 6
7 8 9

7 4 1
8 5 2
9 6 3

3 6 9
2 5 8
1 4 7

9 8 7
6 5 4
3 2 1

以下もうちょい詳しい説明

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]のような行列(にみたてた配列)があった場合、それらを回転させたいとする

流石Rubyということあって reversetransposeという便利メソッドが存在する

reverse

名前の通り配列の順番を反転してくれる

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
p matrix
p matrix.reverse #=> [[7, 8, 9], [4, 5, 6], [1, 2, 3]]

transpose

行と列を入れ替えた配列を作ってくれる 例を見たほうが早い

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
p matrix
p matrix.transpose #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

あとは

  • 右回転したいなら反転→行列入れ替え
    • matrix.reverse.transpose
  • 左回転したいなら行列入れ替え→反転
    • matrix.transpose.reverse
  • 180度回転したいなら反転→各行列内の要素を反転
    • reverse.map(&:reverse)
  • 360度回転させたいならそっとしておく
    • nothing!

させてやればいい