ぶっちゃけまとめ
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ということあって reverse
とtranspose
という便利メソッドが存在する
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!
させてやればいい