JSFiddle - React, Tailwind, and code Playground
HTML
Word directory: <span id="spWords"></span><br>
Word size: <input id="tbWordSize"><br>
Missing letters: <input id="tbLetters"><br>
<button id="gobutton">GO</button><br>
<div id="Info" style="width:95%"></div>
<pre id="Output" style="width:95%; height: 600px; overflow: auto; border: 1px solid #000"></pre>
CSS
body { font-family: sans; }
JavaScript
var words;
var score=0;
function loadWords(e) {
words = e.target.responseText.match(/[a-z]+/g);
console.log( "Got the words file: " + words.length);
document.getElementById('spWords').innerHTML = 'Words: ' + words.length;
};
function bitcount(u) {
for (var n=0; u; score++, ++n, u=u&(u-1));
return n;
}
function elab(word, mask, wordSize, letters, store)
{
var chars, p, bit;
for (; --mask;) {
score++;
if (bitcount(mask) == letters)
{
chars='';
for (bit=1, p = 0; p < wordSize; p++, bit+=bit)
{
score++;
chars += bit & mask ? '-' : word[p];
}
if (!store[chars]) store[chars] = [];
store[chars].push(word);
};
};
}
function go(e) {
document.getElementById('Output').innerHTML = '...';
document.getElementById('Info').innerHTML = '...running...';
store = {};
setTimeout(
function() {
var tstop, tstart = new Date;
var wordSize = document.getElementById('tbWordSize').value;
var letters = document.getElementById('tbLetters').value;
var result, found, i, mask;
console.log(tstart);
console.log(wordSize, letters, words.length);
mask = 1<<wordSize;
for (i = 0; i < words.length; i++)
{
score++;
if (words[i].length == wordSize)
elab(words[i], mask, wordSize, letters, store);
}
keys = Object.keys(store);
keys.sort(function(a,b) {
score++;
return store[b].length - store[a].length;});
tstop = new Date;
console.log(tstop);
console.log('Time to scan (ms) '+ (tstop-tstart));
found = 0;
result = keys.map(
function(key) {
score++;
return store[key][1] ? ( found++, key + ':' +
store[key].length + ':' +
store[key] + '\n'): '';});
document.getElementById('Output').innerHTML = result.join('');
tstop = new Date;
console.log(tstop);
console.log('Total ' + found + ' time (ms) ' +...