開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- Node.js, Safari(JavaScript エンジン)
- Learning JavaScript [邦訳](参考書籍)
行列プログラマー(Philip N. Klein (著)、 松田 晃一 (翻訳)、 弓林 司 (翻訳)、 脇本 佑紀 (翻訳)、 中田 洋 (翻訳)、 齋藤 大吾 (翻訳)、オライリージャパン)の2章(ベクトル)、2.12(ラボ: ドット積を用いた投票記録の比較)、2.12.6(宿敵)、課題 2.12.9 を JavaScript で取り組んでみる。
課題 2.12.9
コード(Emacs)
HTML5
<pre id="output0"></pre> <input id="file0" type="file"> <br> <button id="run0">run</button> <button id="clear0">clear</button> <script src="sample12_9.js"></script>
JavaScript
let btn0 = document.querySelector('#run0'), btn1 = document.querySelector('#clear0'), pre0 = document.querySelector('#output0'), input0 = document.querySelector('#file0'), p = (x) => pre0.textContent += x + '\n'; let createVotingDict = (strArray) => { let d = {}; strArray.forEach((s) => { let a = s.split(/\s+/); d[a[0]] = a.slice(3).map((n) => parseInt(n, 10)); }); return d; }; let policyCompare = (senA, senB, votingDict) => { let a = votingDict[senA], b = votingDict[senB]; return a.reduce((prev, next, i) => prev += next * b[i], 0); }; let mostSimilar = (sen, votingDict) => { let a = votingDict[sen], names = Object.keys(votingDict); names.splice(names.indexOf(sen), 1); let result = names[0], n = policyCompare(sen, result, votingDict); names.slice(1).forEach((name) => { let t = policyCompare(sen, name, votingDict); if (t > n) { n = t; result = name; } }); return result; }; let leastSimilar = (sen, votingDict) => { let a = votingDict[sen], names = Object.keys(votingDict); names.splice(names.indexOf(sen), 1); let result = names[0], n = policyCompare(sen, result, votingDict); names.slice(1).forEach((name) => { let t = policyCompare(sen, name, votingDict); if (t < n) { n = t; result = name; } }); return result; }; let findAverageSimilarity = (sen, senArray, votingDict) => { return senArray .reduce((prev, s) => prev + policyCompare(sen, s, votingDict), 0) / senArray.length; }; let findAverageRecord = (senArray, votingDict) => { return Object.keys(votingDict) .filter((k) => senArray.indexOf(k) !== -1) .map((k) => votingDict[k]) .reduce((x, y) => x.map((a, i) => a + y[i])) .map((x) => x / senArray.length); }; let bitterRivals = (votingDict) => { let names = Object.keys(votingDict), name1 = names[0], name2 = names[1], result = policyCompare(name1, name2, votingDict); names.forEach((n1) => { names.forEach((n2) => { let t = policyCompare(n1, n2, votingDict); if (t < result) { result = t; name1 = n1; name2 = n2; } }); }); return [name1, name2, result]; }; let output = () => { let file = input0.files[0], reader = new FileReader(); reader.onload = () => { let s = reader.result, strArray = s.split('\n'), votingDict = createVotingDict(strArray); p('2.12.9') p(bitterRivals(votingDict)); }; reader.readAsText(file); }; btn0.onclick = output; btn1.onclick = () => pre0.textContent = '';
0 コメント:
コメントを投稿