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