<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Fallout Terminal Solver</title>
<script>
'use strict';
var wordList = [];
var wordLength;
function populateList() {
let wordStr = document.getElementById("words").value.toLowerCase() + " ";
let curWord = "";
let compLtr = "";
for(let i = 0; i < wordStr.length; i++){
compLtr = wordStr.charAt(i);
if(compLtr.toLowerCase() != compLtr.toUpperCase()){
curWord += compLtr;
} else {
if(curWord){
wordList.push({word: curWord, variance: 0});
curWord = "";
}
}
}
if(wordList.length == 0) return;
wordLength = wordList[0].word.length;
return;
}
function calculateSimilarity(w1, w2) {
var ans = 0;
for (let i = 0; i < w1.length; i++) {
if (w1[i] == w2[i]) {
ans += 1;
}
}
return ans;
}
function calculateVariance(numarr) {
let variance = 0;
numarr.forEach(val => {
variance += val;
});
variance /= numarr.length;
for (let i = 0; i < numarr.length; i++) {
numarr[i] -= variance;
numarr[i] *= numarr[i];
}
variance = 0;
numarr.forEach(val => {
variance += val;
});
return variance;
}
function pickBestWord() {
var matchNumbers = [];
for (let i = 0; i < wordLength; i++) {
matchNumbers.push(0);
}
for (var i = 0; i < wordList.length; i++) {
matchNumbers = matchNumbers.map((a) => {
return 0;
});
for (var k = 0; k < wordList.length; k++) {
if (i == k) continue;
let similarity = calculateSimilarity(wordList[i].word, wordList[k].word);
matchNumbers[similarity] += 1;
}
wordList[i].variance = calculateVariance(matchNumbers);
}
let lowestVariance = wordList[0].variance;
let bestWordIndex = 0;
wordList.forEach((val, index) => {
if (val.variance < lowestVariance) {
bestWordIndex = index;
lowestVariance = val.variance;
}
});
return bestWordIndex;
}
function reevaluateList(indexChosen, similarity) {
var wordToCheck = wordList[indexChosen].word;
for (let i = 0; i < wordList.length; i++) {
if (calculateSimilarity(wordToCheck, wordList[i].word) != similarity) {
wordList.splice(i, 1);
i--;
}
}
return;
}
function beginSolve(){
if(wordList.length == 0) {
populateList();
if(wordList.length != 0){
let bes = pickBestWord();
document.getElementById("resultsPane").innerHTML = 'Try the word "' + wordList[bes].word + '" then enter its similarity in the box above and hit "solve"';
} else {
document.getElementById("resultsPane").innerHTML = 'Please input a list of words in the word list before pressing "solve"';
}
} else if(!document.getElementById("sim").value){
let bes = pickBestWord();
document.getElementById("resultsPane").innerHTML += 'Try the word "' + wordList[bes].word + '" then enter its similarity in the box above and hit "solve"';
} else {
let bes = pickBestWord();
let input = document.getElementById("sim").value;
reevaluateList(bes, input);
if (wordList.length == 1) {
document.getElementById("resultsPane").innerHTML = 'Done! The correct word is ' + wordList[0].word + '\n';
} else {
document.getElementById("resultsPane").innerHTML = "List of remaining possible words: ";
wordList.forEach(entry => {
document.getElementById("resultsPane").innerHTML += entry.word + " ";
})
bes = pickBestWord();
document.getElementById("resultsPane").innerHTML += '\n\n';
document.getElementById("resultsPane").innerHTML += 'Try the word "' + wordList[bes].word + '" then enter its similarity in the box above and hit "solve"';
}
}
}
</script>
</head>
<body>
<header>
<p style="font-variant: small-caps">The Fallout Terminal Solver</p>
</header>
<form>
<input placeholder="Initial word list" id="words" type="text" size="98"><br>
<input placeholder="Similarity (given in-game)" id="sim" type="number"><br>
</form>
<button type="button" onclick="beginSolve()">Solve</button><br>
<textarea id="resultsPane" readonly rows="20" cols="100">The initial word list should be all of the words that appear on the terminal, separated by spaces or any other non-letter character</textarea>
</body>
</html>