【JavaScript】2次元配列を90度回転する

2次元配列の回転です。

2次元配列の左90度回転

// 2次元配列の左90度回転
function rotate(array) {
  const ROW = array.length;
  const COL = array[0].length;
  const col = COL-1;
  let a = new Array(COL);
  for (let c=0; c<COL; c++) {
    a[c] = new Array(ROW);
    for (let r=0; r<ROW; r++) {
      a[c][r] = array[r][col-c];
    }
  }
  return a;
}
// ワンライナー版
const rotate = a => a[0].map((_, c) => a.map(r => r[c])).reverse();

使用例

// 座標平面のイメージ
//        y
//         [3,6]
// [6,5,4] [2,5]
// [3,2,1] [1,4]
//        0        x
//   [4,1] [1,2,3]
//   [5,2] [4,5,6]
//   [6,3]

const rotate = a => a[0].map((_, c) => a.map(r => r[c])).reverse();
let a = [
  [1,2,3],
  [4,5,6]
];

// 第一象限
rotate(a)
// [[3,6],
//  [2,5],
//  [1,4]]

// 第二象限
rotate(rotate(a))
// [[6,5,4],
//  [3,2,1]]

// 第三象限
rotate(rotate(rotate(a)))
// [[4,1],
//  [5,2],
//  [6,3]]

// 第四象限
rotate(rotate(rotate(rotate(a))))
// [[1,2,3],
//  [4,5,6]]

2次元配列の右90度回転

// 2次元配列の右90度回転
function rotate(array) {
  const ROW = array.length;
  const COL = array[0].length;
  const row = ROW-1;
  let a = new Array(COL);
  for (let c=0; c<COL; c++) {
    a[c] = new Array(ROW);
    for (let r=0; r<ROW; r++) {
      a[c][r] = array[row-r][c];
    }
  }
  return a;
}
// ワンライナー版
const rotate = a => a[0].map((_, c) => a.map(r => r[c]).reverse());

補足:2次元配列の転置(行列の入れ替え)

// 2次元配列の転置
function transpose(array) {
  const ROW = array.length;
  const COL = array[0].length;
  const col = COL-1;
  let a = new Array(COL);
  for (let c=0; c<COL; c++) {
    a[c] = new Array(ROW);
    for (let r=0; r<ROW; r++) {
      a[c][r] = array[r][c];
    }
  }
  return a;
}
// ワンライナー版
const transpose = a => a[0].map((_, c) => a.map(r => r[c]));

参考

コメントを書く