LoginSignup
0
0

More than 5 years have passed since last update.

俺的順列の生成

Last updated at Posted at 2019-04-21

問題

const combine = [1, 2, 4, 5, 6];
const define = {
  1: [1],
  2: [2],
  3: [3],
  4: [1, 2, 4],
  5: [5],
  6: [0, 6]
}

このデータから

[
  [1, 2, 1, 5, 0],
  [1, 2, 2, 5, 0],
  [1, 2, 4, 5, 0],
  [1, 2, 1, 5, 6],
  [1, 2, 2, 5, 6],
  [1, 2, 4, 5, 6]
]

この配列を生成する(順不問)

ルール

combine は define の key を AND で接続するという意味の配列

define は 自身の番号を OR で 接続するという意味の配列

簡単な例1

const combine = [1, 2];
const define = {
  1: [1],
  2: [2]
}

このデータなら

[
  [1, 2]
]

簡単な例2

const combine = [1, 2];
const define = {
  1: [1],
  2: [2, 3]
}

このデータなら

[
  [1, 2],
  [1, 3]
]

俺的順列の生成


const combine = [1, 2, 4, 5, 6];
const define = {
  1: [1],
  2: [2],
  3: [3],
  4: [1, 2, 4],
  5: [5],
  6: [0, 6]
}

let result = new Array([]);

for (let i = 0; i < combine.length; i++) {
  let defNo = combine[i];
  if (!(defNo in define)) continue; //なければ飛ばす
  let def = define[defNo];
  let defKeys = Object.keys(def);
  // defineNo が複数あった場合に配列を複製する
  if (defKeys.length > 1) {
    let count: number = result.length;
    for (let i = 0; i < count; i++) {
      let base = result[i];
      for (let j = 1; j < defKeys.length; j++) {
        result.push(base.slice(0, base.length));
      }
    }
  }
  // 組み合わせにケース番号を登録する
  let j: number = 0;
  for (let i = 0; i < result.length; i++) {
    let caseNo: string = def[defKeys[j]];
    result[i].push(caseNo);
    j++;
    if (j == defKeys.length) j = 0;
  }
}

console.log(result);

いろいろ 気に入らない

特にここ

  let j: number = 0;
  for (let i = 0; i < result.length; i++) {
    let caseNo: string = def[defKeys[j]];
    result[i].push(caseNo);
    j++;
    if (j == defKeys.length) j = 0;
  }

j をつかった defKeys[j] は
0 6 0 6 0 6 0 6 というふうに defineの数列を 繰り返してほしいのだが、もっとうまい方法があると思う

メモ

とりあえずこれで実装した

メモ代わりに ここに残した

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0