[Toy Problem] 01_rockPaperScissors

17656 ワード

3ゲーム連続でじゃんけんゲームをしたら、一人でいくら出せますか?石ハサミで組み合わせると3^3=27種類の組み合わせが出てきます.1試合を記録したい場合は、以下のような内容になります.
第1セット:岩、岩、岩
第二局:石切り布
第三局:岩、岩、布
...
この問題では,最終的に返される配列順序は重み付け順序に従い,順序はrock,paper,ハサミである.
長い間悩んで、三重複文を作って問題を解いたが、復習コードは私が想像していたよりずっと深くて、空虚だった.
まだ学ぶことがたくさんあります.
let values = ['rock', 'paper', 'scissors'];
上記の値で結果値を決定した場合、以下の結果が推定される.
[0, 0, 0],
[0, 0, 1],
[0, 0, 2],
[0, 1, 0],
[0, 1, 1],
[0, 1, 2],
[0, 2, 0],
[0, 2, 1],
[0, 2, 2],
[1, 0, 0],
[1, 0, 1],
[1, 0, 2],
[1, 1, 0],
[1, 1, 1],
[1, 1, 2],
[1, 2, 0],
[1, 2, 1],
[1, 2, 2],
[2, 0, 0],
[2, 0, 1],
[2, 0, 2],
[2, 1, 0],
[2, 1, 1],
[2, 1, 2],
[2, 2, 0],
[2, 2, 1],
[2, 2, 2]
各インデックスビットの重複部分は、次の3つの重複コードによって問題が解決されることがわかります.
const rockPaperScissors = function (input) {
  let inputValue = input || 3;
  let result = [];
  let values = ['rock', 'paper', 'scissors'];
  let count = 0;
  for(let i = 0; i < inputValue; i++){
    for(let j = 0; j < inputValue; j++){
      while(count < inputValue){
      let value = [];
      value.push(values[i]);
      value.push(values[j]);
      value.push(values[count]);
      result.push(value);
      count++;
      }
      count = 0;
    }
  }
  return result;
};
しかし,これは非常に困難な符号化解法であり,後でより高いレベルの解法を考慮しなければならない.
// 레퍼런스
const rockPaperScissors = function (rounds) {
  rounds = rounds || 3;
  const rps = ['rock', 'paper', 'scissors'];
  const outcomes = [];
  let permutate = function (roundsToGo, playedSoFar) {
    if (roundsToGo === 0) {
      outcomes.push(playedSoFar);
      return;
    }
    for (let i = 0; i < rps.length; i++) {
      let currentPlay = rps[i];
      permutate(roundsToGo - 1, playedSoFar.concat(currentPlay));
    }
  };
  permutate(rounds, []);
  return outcomes;
};