2016年10月3日月曜日

開発環境

アルゴリズムパズル(Anany Levitin (著)、Maria Levitin (著)、黒川 洋 (翻訳)、松崎 公紀 (翻訳)、オライリージャパン)の中級パズル、62.(硬貨拾い(Picking Up Coins))をJavaScriptで。

コード(Emacs)

HTML5

<label for="row0">行数 n = </label>
<input id="row0" type="number" min="1" step="1" value="5">
<label for="col0">列数 m = </label>
<input id="col0" type="number" min="1" step="1" value="6">
硬貨の最大枚数: <span id="coins0"></span><div id="output0"></div>
<script src="matrix.js"></script>
<script src="sample62.js"></script>

JavaScript

'use strict';
let div_output = document.querySelector('#output0'),
    input_row = document.querySelector('#row0'),
    input_col = document.querySelector('#col0'),
    inputs = [input_row, input_col],
    span_coins = document.querySelector('#coins0');

let randomMatrix = (row, col) => {
    let m = new Matrix(row, col);

    for (let i = 1; i <= row; i += 1) {
        for (let j = 1; j <= col; j += 1) {
            let elem = Math.random() < 0.5 ? 0 : 1;
            m.setElement(i, j, elem);
        }
    }
    return m;
};
let robot = (matrix, row, col) => {
    let m = new Matrix(row, col);

    for (let i = 1; i <= row; i += 1) {
        for (let j = 1; j <= col; j += 1) {
            if (i === 1 && j === 1) {
                m.setElement(i, j, matrix.getElement(i, j));
            } else if (i === 1) {
                m.setElement(i, j,
                             m.getElement(i, j - 1) +
                             matrix.getElement(i, j));
            } else if (j === 1) {
                m.setElement(i, j,
                             m.getElement(i - 1, j) +
                             matrix.getElement(i, j));
            } else {
                let elem0 = m.getElement(i, j - 1),
                    elem1 = m.getElement(i - 1, j),
                    elem = Math.max(elem0, elem1) + matrix.getElement(i, j);
                m.setElement(i, j, elem);
            }
        }
    }
    return m;
};
let output = () => {
    let row = parseInt(input_row.value, 10),
        col = parseInt(input_col.value, 10),
        m0 = randomMatrix(row, col),
        m1 = robot(m0, row, col);

    div_output.innerHTML = `${m0} ${m1}`;
    span_coins.innerText = m1.getElement(row, col);
};

inputs.forEach((input) => input.onchange = output);
output();
硬貨の最大枚数:

0 コメント:

コメントを投稿