開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- Safari(Web browser)
- 参考書籍
- JavaScript 第6版 (David Flanagan(著)、村上 列(翻訳)、オライリージャパン)
- JavaScriptリファレンス 第6版(David Flanagan(著)、木下 哲也(翻訳)、オライリージャパン)
アルゴリズムパズル(Anany Levitin (著)、Maria Levitin (著)、黒川 洋 (翻訳)、松崎 公紀 (翻訳)、オライリージャパン)の中級パズル、65.(ビット列の推測 (Code Guessing))をJavaScriptで。
65.(ビット列の推測 (Code Guessing))
コード(Emacs)
HTML5
<label for="n0">ビット列の桁数 n = </label> <input id="n0" type="number" min="1" step="1" value="10"> <button id="start0">推測開始</button> <div id="output0"></div> <button id="show0">提示</button> <script src="sample65.js"></script>
JavaScript
{
'use strict';
let answer,
input_n = document.querySelector('#n0'),
div_output = document.querySelector('#output0'),
button_start = document.querySelector('#start0'),
button_show = document.querySelector('#show0');
let ones = (bits) => {
return bits.reduce((x, y) => x + y, 0);
};
let randomBits = (n) => {
let bits = [];
for (let i = 0; i < n; i += 1) {
bits[i] = Math.random() < 0.5 ? 0 : 1;
}
return bits;
};
let reply = (bits, answer) => {
let count = 0;
for (let i = 0; i < bits.length; i += 1) {
count += bits[i] === answer[i] ? 1 : 0;
}
div_output.innerHTML += `${bits.join('')}: ${count}箇所一致<br>`;
return count;
};
let bitsShow = (m, n) => {
let bits = [];
for (let i = 0; i < m; i += 1) {
bits[i] = 0;
}
for (let i = m; i < n; i += 1) {
bits[i] = 1;
}
return bits;
};
let start = () => {
div_output.innerHTML = '';
let n = parseInt(input_n.value, 10);
let answer = randomBits(n);
let guess = [];
let m = 0;
let count;
let prev;
button_show.onclick = () => {
if (m === 0) {
let bits = bitsShow(0, n);
count = reply(bits, answer);
prev = count;
m += 1;
} else {
let bits = bitsShow(m, n);
let count0 = reply(bits, answer);
guess[m - 1] = prev < count0 ? 0 : 1;
prev = count0;
m += 1;
if (m === n) {
count0 = ones(guess);
guess.push(count > count0 ? 1 : 0);
div_output.innerHTML +=
`${guess.join('')} (推測値)<br>` +
`${answer.join('')} (正解)`;
}
}
};
};
button_start.onclick = start;
button_show.onclick = start;
start();
}
0 コメント:
コメントを投稿