Created
August 16, 2017 11:47
-
-
Save gitfaf/59af55379e48a5e6a4aaae7d1aa1c586 to your computer and use it in GitHub Desktop.
Solves lycanthrope's log problem from eloquent javascript.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Data from http://eloquentjavascript.net/code/#4 */ | |
/* phi logic from http://www.pmean.com/definitions/phi.htm */ | |
var JOURNAL = [ | |
{"events":["carrot","exercise","weekend"],"squirrel":false}, | |
{"events":["bread","pudding","brushed teeth","weekend","touched tree"],"squirrel":false}, | |
{"events":["carrot","nachos","brushed teeth","cycling","weekend"],"squirrel":false}, | |
{"events":["brussel sprouts","ice cream","brushed teeth","computer","weekend"],"squirrel":false}, | |
{"events":["potatoes","candy","brushed teeth","exercise","weekend","dentist"],"squirrel":false}, | |
{"events":["brussel sprouts","pudding","brushed teeth","running","weekend"],"squirrel":false}, | |
{"events":["pizza","brushed teeth","computer","work","touched tree"],"squirrel":false}, | |
{"events":["bread","beer","brushed teeth","cycling","work"],"squirrel":false}, | |
{"events":["cauliflower","brushed teeth","work"],"squirrel":false}, | |
{"events":["pizza","brushed teeth","cycling","work"],"squirrel":false}, | |
{"events":["lasagna","nachos","brushed teeth","work"],"squirrel":false}, | |
{"events":["brushed teeth","weekend","touched tree"],"squirrel":false}, | |
{"events":["lettuce","brushed teeth","television","weekend"],"squirrel":false}, | |
{"events":["spaghetti","brushed teeth","work"],"squirrel":false}, | |
{"events":["brushed teeth","computer","work"],"squirrel":false}, | |
{"events":["lettuce","nachos","brushed teeth","work"],"squirrel":false}, | |
{"events":["carrot","brushed teeth","running","work"],"squirrel":false}, | |
{"events":["brushed teeth","work"],"squirrel":false}, | |
{"events":["cauliflower","reading","weekend"],"squirrel":false}, | |
{"events":["bread","brushed teeth","weekend"],"squirrel":false}, | |
{"events":["lasagna","brushed teeth","exercise","work"],"squirrel":false}, | |
{"events":["spaghetti","brushed teeth","reading","work"],"squirrel":false}, | |
{"events":["carrot","ice cream","brushed teeth","television","work"],"squirrel":false}, | |
{"events":["spaghetti","nachos","work"],"squirrel":false}, | |
{"events":["cauliflower","ice cream","brushed teeth","cycling","work"],"squirrel":false}, | |
{"events":["spaghetti","peanuts","computer","weekend"],"squirrel":true}, | |
{"events":["potatoes","ice cream","brushed teeth","computer","weekend"],"squirrel":false}, | |
{"events":["potatoes","ice cream","brushed teeth","work"],"squirrel":false}, | |
{"events":["peanuts","brushed teeth","running","work"],"squirrel":false}, | |
{"events":["potatoes","exercise","work"],"squirrel":false}, | |
{"events":["pizza","ice cream","computer","work"],"squirrel":false}, | |
{"events":["lasagna","ice cream","work"],"squirrel":false}, | |
{"events":["cauliflower","candy","reading","weekend"],"squirrel":false}, | |
{"events":["lasagna","nachos","brushed teeth","running","weekend"],"squirrel":false}, | |
{"events":["potatoes","brushed teeth","work"],"squirrel":false}, | |
{"events":["carrot","work"],"squirrel":false}, | |
{"events":["pizza","beer","work","dentist"],"squirrel":false}, | |
{"events":["lasagna","pudding","cycling","work"],"squirrel":false}, | |
{"events":["spaghetti","brushed teeth","reading","work"],"squirrel":false}, | |
{"events":["spaghetti","pudding","television","weekend"],"squirrel":false}, | |
{"events":["bread","brushed teeth","exercise","weekend"],"squirrel":false}, | |
{"events":["lasagna","peanuts","work"],"squirrel":true}, | |
{"events":["pizza","work"],"squirrel":false}, | |
{"events":["potatoes","exercise","work"],"squirrel":false}, | |
{"events":["brushed teeth","exercise","work"],"squirrel":false}, | |
{"events":["spaghetti","brushed teeth","television","work"],"squirrel":false}, | |
{"events":["pizza","cycling","weekend"],"squirrel":false}, | |
{"events":["carrot","brushed teeth","weekend"],"squirrel":false}, | |
{"events":["carrot","beer","brushed teeth","work"],"squirrel":false}, | |
{"events":["pizza","peanuts","candy","work"],"squirrel":true}, | |
{"events":["carrot","peanuts","brushed teeth","reading","work"],"squirrel":false}, | |
{"events":["potatoes","peanuts","brushed teeth","work"],"squirrel":false}, | |
{"events":["carrot","nachos","brushed teeth","exercise","work"],"squirrel":false}, | |
{"events":["pizza","peanuts","brushed teeth","television","weekend"],"squirrel":false}, | |
{"events":["lasagna","brushed teeth","cycling","weekend"],"squirrel":false}, | |
{"events":["cauliflower","peanuts","brushed teeth","computer","work","touched tree"],"squirrel":false}, | |
{"events":["lettuce","brushed teeth","television","work"],"squirrel":false}, | |
{"events":["potatoes","brushed teeth","computer","work"],"squirrel":false}, | |
{"events":["bread","candy","work"],"squirrel":false}, | |
{"events":["potatoes","nachos","work"],"squirrel":false}, | |
{"events":["carrot","pudding","brushed teeth","weekend"],"squirrel":false}, | |
{"events":["carrot","brushed teeth","exercise","weekend","touched tree"],"squirrel":false}, | |
{"events":["brussel sprouts","running","work"],"squirrel":false}, | |
{"events":["brushed teeth","work"],"squirrel":false}, | |
{"events":["lettuce","brushed teeth","running","work"],"squirrel":false}, | |
{"events":["candy","brushed teeth","work"],"squirrel":false}, | |
{"events":["brussel sprouts","brushed teeth","computer","work"],"squirrel":false}, | |
{"events":["bread","brushed teeth","weekend"],"squirrel":false}, | |
{"events":["cauliflower","brushed teeth","weekend"],"squirrel":false}, | |
{"events":["spaghetti","candy","television","work","touched tree"],"squirrel":false}, | |
{"events":["carrot","pudding","brushed teeth","work"],"squirrel":false}, | |
{"events":["lettuce","brushed teeth","work"],"squirrel":false}, | |
{"events":["carrot","ice cream","brushed teeth","cycling","work"],"squirrel":false}, | |
{"events":["pizza","brushed teeth","work"],"squirrel":false}, | |
{"events":["spaghetti","peanuts","exercise","weekend"],"squirrel":true}, | |
{"events":["bread","beer","computer","weekend","touched tree"],"squirrel":false}, | |
{"events":["brushed teeth","running","work"],"squirrel":false}, | |
{"events":["lettuce","peanuts","brushed teeth","work","touched tree"],"squirrel":false}, | |
{"events":["lasagna","brushed teeth","television","work"],"squirrel":false}, | |
{"events":["cauliflower","brushed teeth","running","work"],"squirrel":false}, | |
{"events":["carrot","brushed teeth","running","work"],"squirrel":false}, | |
{"events":["carrot","reading","weekend"],"squirrel":false}, | |
{"events":["carrot","peanuts","reading","weekend"],"squirrel":true}, | |
{"events":["potatoes","brushed teeth","running","work"],"squirrel":false}, | |
{"events":["lasagna","ice cream","work","touched tree"],"squirrel":false}, | |
{"events":["cauliflower","peanuts","brushed teeth","cycling","work"],"squirrel":false}, | |
{"events":["pizza","brushed teeth","running","work"],"squirrel":false}, | |
{"events":["lettuce","brushed teeth","work"],"squirrel":false}, | |
{"events":["bread","brushed teeth","television","weekend"],"squirrel":false}, | |
{"events":["cauliflower","peanuts","brushed teeth","weekend"],"squirrel":false} | |
]; | |
function hasEvent (event, entry) { | |
return entry.events.indexOf(event) !== -1; | |
} | |
function tableFor (event, journal) { | |
let table = [0, 0, 0, 0]; | |
for (let i = 0, len = journal.length; i < len; i++) { | |
let entry = journal[i], index = 0; | |
if (hasEvent(event, entry)) index += 1; | |
if (entry.squirrel) index += 2; | |
table[index] += 1; | |
} | |
return table; | |
} | |
var allEvents = []; | |
JOURNAL.forEach(entry => { | |
entry.events.forEach(event => { | |
if (allEvents.indexOf(event) === -1) { allEvents.push(event); } | |
}); | |
}); | |
console.log(allEvents); | |
var allTables = allEvents.map(event => { return {event: event, value: tableFor(event, JOURNAL)}}); | |
console.log(allTables); | |
function phi (a, b, c, d) { | |
const numerator = a * d - b * c; | |
const denominator = Math.sqrt((a + b) * (c + d) * (a + c) * (b + d)); | |
return (numerator/denominator).toFixed(2); | |
} | |
var allPhis = allTables.map(table => { | |
return { event: table.event, phi: phi.apply(null, table.value)}; | |
}); | |
console.log(allPhis); | |
var correlations = [ | |
{ min:-1.0, max: -0.7, result: "strong negative association." }, | |
{ min: -0.7, max: -0.3, result: "weak negative association." }, | |
{ min: -0.3, max: +0.3, result: "little or no association." }, | |
{ min: +0.3, max: +0.7, result: "weak positive association." }, | |
{ min: +0.7, max: +1.0, result: "strong positive association."} | |
]; | |
var rangedCorrelations = [[], [], [], [], []]; | |
var generateRangedCorrelations = function (correlations, phis) { | |
phis.forEach(phi => { | |
if (phi.phi < -0.7) { | |
rangedCorrelations[0].push(phi); | |
} else if (phi.phi < -0.3) { | |
rangedCorrelations[1].push(phi); | |
} else if (phi.phi < 0.3) { | |
rangedCorrelations[2].push(phi); | |
} else if (phi.phi < 0.7) { | |
rangedCorrelations[3].push(phi); | |
} else { | |
rangedCorrelations[4].push(phi); | |
} | |
}); | |
}; | |
generateRangedCorrelations(correlations, allPhis); | |
var strongCorrelations = allPhis.filter(value => { | |
return value.phi < -0.5 || value.phi > 0.5; | |
}); | |
console.log('strongCorrelations', strongCorrelations); | |
console.log('rangedCorrelations', rangedCorrelations); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment