開発環境
- 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 コメント:
コメントを投稿