2016年9月19日月曜日

開発環境

アルゴリズムパズル(Anany Levitin (著)、Maria Levitin (著)、黒川 洋 (翻訳)、松崎 公紀 (翻訳)、オライリージャパン)の初級パズル、48.(マックナゲット数(McNugget Numbers))をJavaScriptで。

コード(Emacs)

HTML5

<label for="num0">マックナゲット数: </label>
<input id="num0" type="number" min="1" step="1" value="10"
       style="text-align: right">
<span id="output0"></span>
<script src="sample48.js"></script>

JavaScript

(function () {
    'use strict';
    var input_num = document.querySelector('#num0'),
        span_output = document.querySelector('#output0'),
        nums = [1, 2, 3, 5, 7, 11],
        d,
        calc,
        output;

    d = {
        4: [1, 0, 0],
        6: [0, 1, 0],
        8: [2, 0, 0],
        9: [0, 0, 1],
        10: [1, 1, 0],
        12: [0, 2, 0],
        13: [1, 0, 1],
        14: [2, 1, 0],
        15: [0, 1, 1]
    };

    calc = function (n) {
        var iter;

        if (nums.indexOf(n) !== -1) {
            return null;
        }
        iter = function (n, result) {
            var d0;
            
            if (n < 16) {
                d0 = d[n];
                result[0] += d0[0];
                result[1] += d0[1];
                result[2] += d0[2];
                return result;
            }
            result[0] += 1;
            return iter(n - 4, result);
        };
        return iter(n, [0, 0, 0]);
    };
    output = function () {
        var n = parseInt(input_num.value, 10),
            result;

        try {
            result = calc(n);
        } catch (e) {
            span_output.innerText = e.message;
            return;
        }
        if (result === null) {
            span_output.innerText = 'マックナゲット数ではない。';
        } else {
            span_output.innerText =
                ' = 4 * ' + result[0] +
                ' + 6 * ' + result[1] +
                ' + 9 * ' + result[2];
        }
    };
    input_num.onchange = output;
    output();
}());

0 コメント:

コメントを投稿