Last active
March 24, 2022 07:33
-
-
Save blakesanie/c07d6e35b144d330eb2259c9753f37e9 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
| var fs = require("fs"); | |
| var text; | |
| var markovChain = {}; | |
| var file = "sampleText.txt"; | |
| start(); | |
| function start() { | |
| fs.readFile(file, "utf8", function(err, data) { | |
| if (err) throw err; | |
| var text = data | |
| .replace(/[^\w\s]|_/g, "") | |
| .replace(/\s+/g, " ") | |
| .replace(/[a-z]*\d+[a-z]*/gi, "") | |
| .replace(/\s+/g, "") | |
| .toLowerCase(); //remove non-alphabetical chars | |
| processChars(text); | |
| }); | |
| } | |
| function processChars(string) { | |
| for (var i = 0; i <= string.length - 1; i++) { | |
| var gram = string.substring(i, i + 1); | |
| var nextChar = string.charAt(i + 1); | |
| if (!markovChain[gram]) { | |
| markovChain[gram] = { | |
| freq: 0 | |
| }; | |
| markovChain[gram][nextChar] = 0; | |
| } | |
| if (!markovChain[gram][nextChar]) { | |
| markovChain[gram][nextChar] = 0; | |
| } | |
| markovChain[gram][nextChar]++; | |
| markovChain[gram]["freq"]++; | |
| } | |
| loadKeys(); | |
| } | |
| function getMostUsed() { | |
| var ngramArray = []; | |
| Object.keys(markovChain).forEach(function(key) { | |
| var obj = {}; | |
| obj[key] = markovChain[key]; | |
| ngramArray.push(obj); | |
| }); | |
| ngramArray = ngramArray.sort(function(a, b) { | |
| var aSubObj = a[Object.keys(a)[0]]; | |
| var bSubObj = b[Object.keys(b)[0]]; | |
| return bSubObj["freq"] - aSubObj["freq"]; | |
| }); | |
| ngramArray = ngramArray.map(removeInfo); | |
| return ngramArray; | |
| } | |
| var topRow = []; | |
| var middleRow = []; | |
| var bottomRow = []; | |
| function loadKeys() { | |
| var mostUsed = getMostUsed(); | |
| console.log(mostUsed); | |
| middleRow = mostUsed.slice(0, 9); | |
| topRow = mostUsed.slice(9, 19); | |
| bottomRow = mostUsed.slice(19); | |
| optimizeMiddleRow(); | |
| optimizeTopRow(); | |
| optimizeBottomRow(); | |
| printKeys(); | |
| printKeyArray(); | |
| } | |
| function optimizeMiddleRow() { | |
| var permutations = permut(middleRow.join("")); | |
| middleRow = optimalPermutation(permutations); | |
| } | |
| function optimizeTopRow() { | |
| var permutations = permut(topRow.join("")); | |
| topRow = optimalPermutation(permutations); | |
| } | |
| function optimizeBottomRow() { | |
| var permutations = permut(bottomRow.join("")); | |
| bottomRow = optimalPermutation(permutations); | |
| } | |
| function optimalPermutation(perms) { | |
| var minVal = Number.MAX_VALUE; | |
| var minIndex; | |
| for (var i = 0; i < perms.length; i++) { | |
| var sum = 0; | |
| var left = middleRow.slice(0, 6); | |
| var right = middleRow.slice(6); | |
| for (var j = 0; j < left.length; j++) { | |
| var currentCharObj = markovChain[perms[i].charAt(j)]; | |
| for (var k = 0; k < left.length; k++) { | |
| if (j != k) { | |
| if (currentCharObj[perms[i].charAt(k)]) { | |
| sum += currentCharObj[perms[i].charAt(k)]; | |
| } | |
| } | |
| } | |
| } | |
| for (var j = 0; j < right.length; j++) { | |
| var currentCharObj = markovChain[perms[i].charAt(j)]; | |
| for (var k = 0; k < right.length; k++) { | |
| if (j != k) { | |
| if (currentCharObj[perms[i].charAt(k)]) { | |
| sum += currentCharObj[perms[i].charAt(k)]; | |
| } | |
| } | |
| } | |
| } | |
| if (sum < minVal) { | |
| minVal = sum; | |
| minIndex = i; | |
| } | |
| console.log(i + " / " + perms.length + " permutations"); | |
| } | |
| return perms[minIndex].split(""); | |
| } | |
| function printKeyArray() { | |
| var total = topRow.concat(middleRow).concat(bottomRow); | |
| console.log("\n" + JSON.stringify(total) + "\n"); | |
| } | |
| function permut(string) { | |
| if (string.length < 2) return string; // base case | |
| var permutations = []; | |
| for (var i = 0; i < string.length; i++) { | |
| var char = string[i]; | |
| if (string.indexOf(char) != i) continue; // skip char if already use | |
| var remainingString = | |
| string.slice(0, i) + string.slice(i + 1, string.length); | |
| for (var subPermutation of permut(remainingString)) // recursion! | |
| permutations.push(char + subPermutation); | |
| } | |
| return permutations; | |
| } | |
| function removeInfo(obj) { | |
| return Object.keys(obj)[0]; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment