2017年4月23日日曜日

開発環境

行列プログラマー(Philip N. Klein (著)、 松田 晃一 (翻訳)、 弓林 司 (翻訳)、 脇本 佑紀 (翻訳)、 中田 洋 (翻訳)、 齋藤 大吾 (翻訳)、オライリージャパン)の2章(ベクトル)、2.12(ラボ: ドット積を用いた投票記録の比較)、2.12.4(ポリシーの比較)、課題 2.12.2、2.12.3、2.12.4、2.12.5 を JavaScript で取り組んでみる。

課題 2.12.2、2.12.3、2.12.4、2.12.5

voting_record_dump109.txt

コード(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_2.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 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.2')
        let names = Object.keys(votingDict);

        for (let i = 0; i < 10; i += 1) {
            let senA = names[Math.floor(Math.random() * names.length)],
                senB = names[Math.floor(Math.random() * names.length)];
            p(`${senA}, ${senB}: ${policyCompare(senA, senB, votingDict)}`);
        }
        p('2.12.3');
        let sen = 'Crapo',
            name = mostSimilar(sen, votingDict);
        [sen, name].forEach((n) => {
            p(`${n}: ${votingDict[n]}`);
        });
        p('2.12.4');
        name = leastSimilar(sen, votingDict);
        [sen, name].forEach((n) => {
            p(`${n}: ${votingDict[n]}`);
        });
        p('2.12.5');
        p(mostSimilar('Lincoln', votingDict));
        p(leastSimilar('Santorum', votingDict));
    };
    reader.readAsText(file);
};

btn0.onclick = output;
btn1.onclick = () => pre0.textContent = '';



0 コメント:

コメントを投稿