新・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);
});
});
...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);
});
});
C++の実装例参照を参照しました。ループの回数が多い…。
コメント