UNPKG

stackflow

Version:

Generate a software stack that markets itself!

101 lines (79 loc) 2.12 kB
'use strict'; var fs = require('fs'); var words = require('sowpods') .filter(function filterWords(word) { return (word.length === 4 || word.length === 5) }); // TODO: Add more var software = fs.readdirSync(__dirname + '/data') .map(function eachFile(file) { return fs.readFileSync(__dirname + '/data/' + file, 'utf-8') .split('\n') .filter(Boolean) }); //+ Jonas Raoni Soares Silva //@ http://jsfromhell.com/array/shuffle [v1.0] function shuffle(o){ //v1.0 for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); return o; }; // TODO: Un-WTF-ify... I don't think this 'algorithm' is optimal.. or even correct function findStack(word) { var combinations = { 5: 120, 4: 24 } var stack, found; var order, orders = { }; for (var tried = 0; tried < combinations[word.length]; tried++) { do { order = shuffle([0, 1, 2, 3, 4] .slice(0, word.length)).join(''); } while(orders[order]); found = true; stack = []; order = order.split(''); var available = null, softwareUsed = { }; shuffle(software); // for good measure for (var i = 0; i < order.length; i++) { for (var j = 0; j < software.length; j++) { if (softwareUsed[j]) continue; available = software[j].filter(function eachSoftware(software) { return software.toUpperCase()[0] === word[order[i]][0]; }); if (available.length) { softwareUsed[j] = true; break; } } if (!available.length) { found = false; break; } stack[order[i]] = available[0 ^ Math.random() * available.length]; } if (found) { return { name: word, stack: stack }; } } } function makeStack(word) { if (word) { return findStack(word.toUpperCase()); } shuffle(words); while (true) { word = words.pop(); if (!word) return; var result = findStack(word.toUpperCase()); if (result) { return result; } } } module.exports = makeStack;