開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- JavaScript Library
- Safari(Web browser)
- 参考書籍
- JavaScript 第6版 (David Flanagan(著)、村上 列(翻訳)、オライリージャパン)
- JavaScriptリファレンス 第6版(David Flanagan(著)、木下 哲也(翻訳)、オライリージャパン)
アルゴリズムパズル(Anany Levitin (著)、Maria Levitin (著)、黒川 洋 (翻訳)、松崎 公紀 (翻訳)、オライリージャパン)の中級パズル、97.(上部交換ゲーム (The Game of Topswops))をJavaScriptで。
97.(上部交換ゲーム (The Game of Topswops))
n=13(キング)が山の一番上のカードになるのは、最初に山の一番上にある場合で、1回以下。(13枚のカードをめくり、それを逆順に戻すと、13(キング)は一番下になり、それ以外は12(クイーン)以下だから、13の場所がそれ以降変わることはない。)
n=12(クイーン)が山の一番上のカードになるのは、最初に山の一番上にあり、次に上から12番目になり、その後、12番目のカードが並び替えられるのは、n=13(キング)が一番上のカードの場合のみで、キングが一番上にあるのは1回以下なので、n=12(クイーン)が1番上にある場合は2回以下。
有限回の繰り返しでゲームは終了する。
JavaScriptで確認。
コード(Emacs)
HTML5
<p>左から右を上から下とする。</p> <div id="output0"></div> <button id="shuffle0">シャッフル</button> <script src="sample97.js"></script>
JavaScript
{
'use strict';
Array.prototype.shuffle = function () {
var shuffled = [],
len = this.length,
len0,
i;
for (len0 = len; len0 > 0; len0 -= 1) {
i = Math.floor(Math.random() * len0);
shuffled.push(this[i]);
this.splice(i, 1);
}
for (i = 0; i < len; i += 1) {
this[i] = shuffled[i];
}
};
let range = (start=0, end=0, step=1) => {
let result = [];
for (let i = start; i < end; i += step) {
result.push(i);
}
return result;
}
let div_output = document.querySelector('#output0'),
btn_shuffle = document.querySelector('#shuffle0');
let game = (cards) => {
div_output.innerHTML += `${cards.join(' ')}<br>`;
if (cards[0] !== 1) {
let cards0 = cards.slice(0, cards[0]);
let cards1 = cards.slice(cards[0]);
cards0.reverse();
setTimeout(() => {
game(cards0.concat(cards1));
}, 1000);
}
};
let output = () => {
let cards = range(1, 14);
cards.shuffle();
div_output.innerHTML = '';
game(cards);
}
btn_shuffle.onclick = output;
output();
}
左から右を上から下とする。
0 コメント:
コメントを投稿