Difficult Word Finder
MTG "Hangman"
by skibulk
HTML
<p>Please select <a href="http://norvig.com/ngrams/count_1w100k.txt" target="_blank">Common Words List</a>:</p>
<p><input id="browse" type="file" /><br></p>
<p>Please select <a href="https://boardgames.stackexchange.com/a/38386" target="_blank">Real Words List</a>:</p>
<p><input id="browse2" type="file" /><br></p>
<p>The intersection of common words and real words will be found. All intersecting 8-letter words with no duplicate letters will be returned (see console).</p>
JavaScript
// Future consideration: number of vowels
// Interesting: https://www.keithv.com/software/wlist/
console.clear();
// Test Data
var wordsTest = wordsToArray(`GO\t100
TEST\t100
ABCUVWXY\t100
ABCDWXYZ\t100
ABCDEXYZ\t100`);
wordsAnalyze(wordsTest, wordsTest);
// Real Data
var wordsReal ={
ranked:false,
bounded:false
}
listen("browse", "ranked");
listen("browse2", "bounded");
function listen(source, destination){
var browse = document.getElementById(source);
browse.onchange = function(event){
var file, fr;
file = browse.files[0];
fr = new FileReader();
fr.onload = receivedText;
fr.readAsText(file);
function receivedText(e) {
var words = e.target.result;
wordsReal[destination] = wordsToArray(words);
ready();
}
}
}
function ready(){
if(wordsReal.ranked && wordsReal.bounded){
wordsAnalyze(wordsReal.ranked, wordsReal.bounded);
}
}
function wordsToArray(words){
console.log("Word Bytes:", words.length);
words = words.split(/[\r\n]+/gm);
for(var i=0; i<words.length; i++){
words[i] = words[i].split(/\s+/)[0];
}
console.log("Word Array:", words);
return words;
}
function wordsAnalyze(common, bounded){
/*
// Limit first 100K common words
if(common.length > 100000) {
common.length = 100000;
}
*/
// Only use intersecting words
var words = [];
for(var i = 0; i<common.length; i++){
var word = common[i];
if(bounded.includes(word)) {
words.push(word);
}
}
/*
Sort by pattern frequency (the average number of times each of its 3-letter slices appear in other words), with less-patterened words appearing first (which are presumably less likely to be guessed).
// Pattern frequency per 3-letter groups
var patterns = {};
for(var i=0; i<words.length; i++){
var word = words[i];
for(var j=0; j<word.length-2; j++){
var pattern = word.substring(j, j+3);
if(patterns[pattern]){
patterns[pattern]++;
}
else {
...