開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- kjs-array (JavaScript Library)
- Safari(Web browser)
- 参考書籍
- JavaScript 第6版 (David Flanagan(著)、村上 列(翻訳)、オライリージャパン)
- JavaScriptリファレンス 第6版(David Flanagan(著)、木下 哲也(翻訳)、オライリージャパン)
アルゴリズムパズル(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 コメント:
コメントを投稿