開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- JavaScript Library
- Safari(Web browser)
- 参考書籍
- JavaScript 第6版 (David Flanagan(著)、村上 列(翻訳)、オライリージャパン)
- JavaScriptリファレンス 第6版(David Flanagan(著)、木下 哲也(翻訳)、オライリージャパン)
アルゴリズムパズル(Anany Levitin (著)、Maria Levitin (著)、黒川 洋 (翻訳)、松崎 公紀 (翻訳)、オライリージャパン)の中級パズル、66.(残る数字 (Remaining Number))をJavaScriptで。
66.(残る数字 (Remaining Number))
一回の操作で1つの数字が消えるから、49回の操作後に残る数字は1つ。
総和、部分和を考える。
偶奇性(パリティ)は一定で、Sは奇数なことから、最後に残り得る数字は奇数
よって、黒板上に残り得る数字は、1以上49以下の奇数。
コード(Emacs)
HTML5
<div id="output0"></div> <button id="display0">開始</button> <script src="sample66.js"></script>
JavaScript
{ 'use strict'; Array.range = function (start, end, step) { var nums = [], i; if (step === 0) { throw { name: 'ValueError', message: 'range() arg 3 must not be zero', }; } if (step === undefined) { step = 1; } if (end === undefined) { end = start; start = 0; } if (step > 0) { for (i = start; i < end; i += step) { nums.push(i); } } else { for (i = start; i > end; i += step) { nums.push(i); } } return nums; }; let div_output = document.querySelector('#output0'), button_display = document.querySelector('#display0'); let getIndexes = (n) => { let i = Math.floor(Math.random() * n), j = Math.floor(Math.random() * n); for (; i === j; ) { j = Math.floor(Math.random() * n); } return [i, j]; }; let display = () => { let nums = Array.range(1, 51), output = ''; output += `黒板: ${nums.join(' ')}<br>`; for (let i = 50; i >= 2; i -= 1) { let [ai, bi] = getIndexes(i); let a = nums[ai]; let b = nums[bi]; nums.push(Math.abs(a - b)); output += `記入: ${nums.join(' ')}<br>`; if (ai > bi) { nums.splice(ai, 1); nums.splice(bi, 1); } else { nums.splice(bi, 1); nums.splice(ai, 1); } output += `削除: ${nums.join(' ')}<br>`; } div_output.innerHTML = output; }; display(); button_display.onclick = display; }
0 コメント:
コメントを投稿