開発環境
- 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 (著)、黒川 洋 (翻訳)、松崎 公紀 (翻訳)、オライリージャパン)の中級パズル、58.(2色の帽子(Hats of Two Colors))をJavaScriptで。
コード(Emacs)
HTML5
<label for="black0"> 黒い帽子: </label> <input id="black0" type="number" min="1" max="11" step="1" value="6">人、 白い帽子: <span id="white0"></span>人 <button id="start0">開始</button> <div id="output0"></div> <button id="next0">5分後</button> <script src="sample59.js"></script>
JavaScript
{ 'use strict'; Array.prototype.shuffle = function () { var shuffled = [], len = this.length, len0, i; for (len0 = len; len0 > 0; len0 -= 1) { i = Math.floor(Math.random() * len0); shuffled.push(this[i]); this.splice(i, 1); } for (i = 0; i < len; i += 1) { this[i] = shuffled[i]; } }; let div_output = document.querySelector('#output0'), input_black = document.querySelector('#black0'), span_white = document.querySelector('#white0'), button_start = document.querySelector('#start0'), button_next = document.querySelector('#next0'), nl = '<br>', t = new Date(), nums = 12, count, person = (num, color, others, count) => { return { num: num, color: color, others: others, count: count, toString: () => { return `${num}${color}`; }, }; }; let people; let start = () => { let black = parseInt(input_black.value), white = nums - black, colors = []; count = 0; people = []; for (let i = 0; i < nums; i += 1) { let color = i < black ? '黒' : '白'; colors[i] = color; } colors.shuffle(); for (let i = 0; i < nums; i += 1) { let color = colors[i], others = colors.slice(0, i).concat(colors.slice(i + 1)), c = 0; others.forEach((other) => { if (other === '黒') { c += 1; } }); people[i] = person(i, color, others, c); } t.setHours(12, 5); div_output.innerHTML = `${t.getHours()}:${t.getMinutes()}${nl}` + people.join(' ') + nl; }; let next = () => { t.setMinutes(t.getMinutes() + 5); count += 1; let people0 = []; for (let i = 0; i < nums; i += 1) { if (people[i] !== ' ' && people[i].count === count - 1) { people0.push(people[i]); people[i] = ' '; } } div_output.innerHTML += `${nl}${t.getHours()}:${t.getMinutes()}${nl}` + people.join(' ') + nl + people0.join(' ') + nl; }; button_start.onclick = start; button_next.onclick = next; span_white.innerText = nums - parseInt(input_black.value, 10); input_black.onchange = () => span_white.innerText = nums - parseInt(input_black.value, 10); }人、 白い帽子: 人
0 コメント:
コメントを投稿