2016年11月10日木曜日

開発環境

アルゴリズムパズル(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回以下。

S n1 =1+ S n <

有限回の繰り返しでゲームは終了する。

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 コメント:

コメントを投稿