yucatio@システムエンジニア

趣味で作ったものいろいろ

JavaScriptで転置を実装する (KATAMINOを解くプログラムを作成する)

★前回の記事

yucatio.hatenablog.com

ピースの回転、反転を行うために2次元配列の転置を行います。転置を行う理由については以下の記事を参照してください。

yucatio.hatenablog.com

各spinは0番を始めとして以下の順番で生成します。

f:id:yucatio:20190702083723p:plain

はじめに0番目のスピンから7番目のスピンを作成します。

コーディング

プログラミングしていきます。 まず、回転した形を格納する配列を宣言し、0番に受け取ったピースを格納します。

0番を転置して7番のspinを作成します。転置を行う関数(transpose)は一旦仮の実装にしてあります。

function createKataminoSpinList(piece) {
  // 回転した形を格納する配列
  let spinArray = []

  // 受け取ったピースを格納する
  spinArray[0] = piece
  console.log("spinArray[0]", spinArray[0])
  // 0番を転置したものが7番
  spinArray[7] = transpose(spinArray[0])
  console.log("spinArray[7]", spinArray[7])
}

/*
 * 2次元配列の転置をする
 */ 
function transpose(spin) {
  // TODO 実装
  return spin
}

transposeを実装していきましょう。もとの配列が2*3の配列だとしたら、転置後は3*2の配列になります。JavaScriptでは2次元配列を宣言する構文はないので、配列を宣言後、その配列の各要素にさらに配列を入れます。

転置するには、1番目と2番目のインデックスを入れ替える必要があるので、forEachの2重ループを使います。

function transpose(spin) {
  // 転置した配列
  let transposed = []

  // 2次元配列に初期化する
   spin[0].forEach((_, i) => {
     transposed[i] = []
   })

  // 1番目のインデックスと2番目のインデックスを入れ替える
  spin.forEach((row, i) => {
    row.forEach((value, j) => {
      transposed[j][i] = value
    })
  })

  return transposed
}

実行結果

それぞれのピースを転置したものがコンソールに表示されて入れば成功です。

f:id:yucatio:20190705231827p:plain

リファクタリング

ネットを検索したところ、transposeは以下のようにリファクタリングできます。 理解に時間がかかりますが、こちらを採用しても良いでしょう。

function transpose(spin) {
  return  spin[0].map((_, i) => spin.map(row => row[i]));
}

先ほど作成したプログラムで、最初の配列の配列を準備するところだけ、以下のようにspin[0]の数だけ空で初期化された配列を用意する方法にしてもよいです。

function transpose(spin) {
  let transposed = spin[0].map(() => [])

  spin.forEach((row, i) => {
    row.forEach((value, j) => {
      transposed[j][i] = value
    })
  })

  return transposed
}

以上で転置を実装して、7番の行列を得ることができました。


★次回の記事

yucatio.hatenablog.com

★目次

yucatio.hatenablog.com