about summary refs log tree commit diff stats
path: root/js/bird-words/beak.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/bird-words/beak.js')
-rw-r--r--js/bird-words/beak.js46
1 files changed, 46 insertions, 0 deletions
diff --git a/js/bird-words/beak.js b/js/bird-words/beak.js
new file mode 100644
index 0000000..38a2584
--- /dev/null
+++ b/js/bird-words/beak.js
@@ -0,0 +1,46 @@
+const fs = require('fs');
+
+const wrap = (str, width) => {
+    const words = str.split(' ');
+    return words.reduce((output, word) => {
+        if (output.length === 0 || output[output.length - 1].length + word.length + 1 > width) {
+            output.push(word);
+        } else {
+            output[output.length - 1] += ' ' + word;
+        }
+        return output;
+    }, []).join('\n');
+};
+
+const prettyItUp = string => {
+    return string.charAt(0).toUpperCase() + string.slice(1) + "!";
+}
+
+let corpus = fs.readFileSync('input.txt', 'utf8');
+let words = corpus.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"").replace(/\n/g, " ").replace(/\s{2,}/g, " ").split(" ");
+
+let markovChain = new Map();
+
+for (let i = 0; i < words.length - 2; i++) {
+    let pair = words[i] + ' ' + words[i + 1];
+    if (!markovChain.has(pair)) {
+        markovChain.set(pair, []);
+    }
+    markovChain.get(pair).push(words[i + 2]);
+}
+
+let pairs = Array.from(markovChain.keys());
+let randomPair = pairs[Math.floor(Math.random() * pairs.length)];
+let story = randomPair;
+const storyLength = 100;
+
+for (let i = 0; i < storyLength; i++) { 
+    let nextWords = markovChain.get(randomPair);
+    if (!nextWords) {
+        break;
+    }
+    randomPair = randomPair.split(' ')[1] + ' ' + nextWords[Math.floor(Math.random() * nextWords.length)];
+    story += " " + randomPair.split(' ')[1];
+}
+
+console.log(wrap(prettyItUp(story), 40));