開発環境
- 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 コメント:
コメントを投稿