【sim2】perfuct shuffle《新・Bランクup》

新・Bランクレベルアップ【シミュレーション 2】perfuct shuffle

【シミュレーション 2】perfuct shuffle コード 1/2

reader.on('close', () => {
   const K = Number(lines[0]);
   const deck = [];  // 山札
   const upper_side = [];  // 上半分
   const lower_side = [];  // 下半分
   const mark = ['S', 'H', 'D', 'C'];  // トランプの絵柄

   for (let i = 0; i < 4; i++) {
      for (let j = 1; j <= 13; j++) {
         deck.push(mark[i] + '_' + j);  // 'S_1'〜'H_13'を deck に積み重ねる
      }
   }
   for (let i = 0; i < K; i++) {  // パーフェクトシャッフルを K 回 繰り返し
      upper_side.push(...deck.splice(0, 26));  // 上半分のカード(deck から 26 枚切り取り)
      lower_side.push(...deck.splice(0, 26));  // 下半分のカード(残りの 26 枚)
      for (let j = 0; j < 26; j++) {
         deck.unshift(lower_side.pop());  // 下半分の下から j 番目のカードを deck
         deck.unshift(upper_side.pop());  // 上半分の下から j 番目のカードを deck
      }
   }
   deck.forEach(value => {
      console.log(value);
   });
});
hogeちゃんの画像

...deck.splice(0, 26)deck の先頭から26個の要素を切り取った値の配列を展開した26個の値。

【シミュレーション 2】perfuct shuffle コード 2/2

reader.on('close', () => {
   const K = Number(lines[0]);
   const deck = new Array(52);
   const upper_side = new Array(26);
   const lower_side = new Array(26);
   const mark = ['S', 'H', 'D', 'C'];
   for (let i = 3; i >= 0; i--) {
      for (let j = 13; j >= 1; j--) {
         deck[i * 13 + j - 1] = mark[i] + '_' + j;
      }
   }
   for (let i = 0; i < K; i++) {
      for (let j = 0; j < 26; j++) {
         upper_side[j] = deck[j];
      }
      for (let j = 0; j < 26; j++) {
         lower_side[j] = deck[26 + j];
      }
      for (let j = 0; j < 52; j++) {
         if (j % 2 == 0) {
            deck[j] = upper_side[j / 2];
         } else {
            deck[j] = lower_side[Math.floor(j / 2)];
         }
      }
   }
   deck.forEach(value => {
      console.log(value);
   });
});
hogeちゃんの画像

C++の実装例参照を参照しました。ループの回数が多い…。

コメント