2016年9月27日火曜日

開発環境

アルゴリズムパズル(Anany Levitin (著)、Maria Levitin (著)、黒川 洋 (翻訳)、松崎 公紀 (翻訳)、オライリージャパン)の中級パズル、56.(新兵の整列(Lining Up Recruits))をJavaScriptで。

コード(Emacs)

HTML5

<p>
  <label for="num0">新兵の人数: </label>
  <input id="num0" type="number" min="2" step="1" value="10">
</p>
<div id="output0"></div>
<ul>
  <li>
    <p>良き兵士シュヴェイクの並ばせ方。</p>
    <div id="output1"></div>
  </li>
  <li>
    <p>隣り合う兵士同士の身長の差の平均が最小になる並ばせ方。</p>
    <p>降順</p>
    <div id="output2"></div>
    <p>昇順</p>
    <div id="output3"></div>    
  </li>
</ul>

<script src="array.js"></script>
<script src="sample56.js"></script>

JavaScript

(() => {
    'use strict';
    let input_num = document.querySelector('#num0'),
        nl = '<br><br>',
        div_output0 = document.querySelector('#output0'),
        div_output1 = document.querySelector('#output1'),
        div_output2 = document.querySelector('#output2'),
        div_output3 = document.querySelector('#output3'),
        getRecruits,
        height,
        average,    
        output;

    average = (nums) => {
        let total = 0;

        for (let i = 0; i < nums.length - 1; i += 1) {
            total += Math.abs(nums[i] - nums[i + 1]);
        }
        return total / nums.length - 1;
    };
    height = () => (15000 + Math.floor(Math.random() * 5000)) / 100;

    getRecruits = () => {
        let n = parseInt(input_num.value, 10),
            recruits = Array.range(n).map(height);

        div_output0.innerHTML =
            recruits.join(', ') + nl;
        return recruits;
    };
    output = function () {
        let recruits = getRecruits(),
            max = Math.max.apply(null, recruits),
            min = Math.min.apply(null, recruits);

        [min, max].forEach(
            (height) => recruits.splice(recruits.indexOf(height), 1));
        recruits.shuffle();
        recruits.unshift(max);
        recruits.push(min);
        div_output1.innerHTML =
            recruits.join(', ') + nl +
            '隣り合う兵士同士の身長差の平均: ' + average(recruits);

        recruits.sort((x, y) => y - x);
        div_output2.innerHTML =
            recruits.join(', ') + nl +
            '隣り合う兵士同士の身長差の平均: ' + average(recruits);
        recruits.sort();
        div_output3.innerHTML =
            recruits.join(', ') + nl +
            '隣り合う兵士同士の身長差の平均: ' + average(recruits);
    };
    input_num.onchange = output;

    output();
})();

  • 良き兵士シュヴェイクの並ばせ方。

  • 隣り合う兵士同士の身長の差の平均が最小になる並ばせ方。

    降順

    昇順

0 コメント:

コメントを投稿