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 {
       ...