@pasciaks/lostwords-org-library
Version:
Lostwords.org - Word search generator and function library.
909 lines (772 loc) • 31.7 kB
JavaScript
// -- Externally configurable
let global_squarePuzzleSize = 14;
let global_p_bends = 0;
let global_puzzleshapeoverride = "";
let global_diagonals = "yes";
let global_wordlistoption = "A";
let global_title_name = "Puzzle Title";
let global_clueoption = "U";
let global_blanks = "";
let global_p_words = "LOST,WORDS";
let global_post_msg = "Post Message - Puzzle Solved";
let global_pre_msg = "Pre Message - Good Luck";
// -- Internal Use
let global_hidden_words = '';
let global_noDiagonals = false;
let global_must_be_diagonal = false;
let global_puzzleData = "";
let global_letterChoices = "";
let global_p_data = "";
let global_p_locations = "";
let global_wordLetters = "";
let global_shrinkamt = 0;
let global_frect = "9,9,9,9, ";
let global_point = new Object();
let global_currentPath = new Array();
let global_locationsArray = new Array();
let global_foundLocations = new Array();
const setGlobalOptionValue = (variable, val) => {
switch (variable) {
case "global_squarePuzzleSize":
global_squarePuzzleSize = val;
break;
case "global_p_bends":
global_p_bends = val;
break;
case "global_puzzleshapeoverride":
global_puzzleshapeoverride = val;
break;
case "global_diagonals":
global_diagonals = val;
break;
case "global_wordlistoption":
global_wordlistoption = val;
break;
case "global_title_name":
global_title_name = val;
break;
case "global_clueoption":
global_clueoption = val;
break;
case "global_blanks":
global_blanks = val;
break;
case "global_p_words":
global_p_words = `${val}`;
break;
case "global_post_msg":
global_post_msg = val;
break;
case "global_pre_msg":
global_pre_msg = val;
break;
}
};
/**
* arrayDifferences
*
* @param {*} array1
* @param {*} array2
* @returns
*/
function arrayDifferences(array1, array2) {
// Check if both inputs are arrays
if (!Array.isArray(array1) || !Array.isArray(array2)) {
return "Both inputs must be arrays.";
}
// Create arrays to hold differences
const differences1 = [];
const differences2 = [];
// Find differences in array1 compared to array2
for (const element of array1) {
if (!array2.includes(element)) {
differences1.push(element);
}
}
// Find differences in array2 compared to array1
for (const element of array2) {
if (!array1.includes(element)) {
differences2.push(element);
}
}
return [differences1, differences2];
}
/**
* compareArrays
*
* @param {*} array1
* @param {*} array2
* @returns
*/
function compareArrays(array1, array2) {
// Check if both inputs are arrays
if (!Array.isArray(array1) || !Array.isArray(array2)) {
return false;
}
// Check if the arrays have the same length
if (array1.length !== array2.length) {
return false;
}
// Sort the arrays to ensure consistent comparison
const sortedArray1 = array1.slice().sort();
const sortedArray2 = array2.slice().sort();
// Compare each element of the sorted arrays
for (let i = 0; i < sortedArray1.length; i++) {
if (sortedArray1[i] !== sortedArray2[i]) {
return false;
}
}
return true;
}
/**
* reverseString
*
* @param {string} string_value
* @returns {string || null}
*/
const reverseString = (string_value) => {
if (!string_value) return null;
let new_string_value = "";
for (i = string_value.length - 1; i >= 0; i--) {
new_string_value += string_value.charAt(i);
}
return new_string_value;
};
/**
* scramble
*
* @param {*} str
* @returns
*/
const scramble = (str) => {
let scrambled = "",
src = str.split("");
let randomNum;
while (src.length > 1) {
randomNum = Math.floor(Math.random() * src.length);
scrambled += src[randomNum];
src.splice(randomNum, 1);
}
scrambled += src[0];
return scrambled;
};
/**
* randRange
*
* @param {*} min
* @param {*} max
* @returns
*/
const randRange = (min, max) => {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
/**
* shrinkPuzzle
*
* @param {*} howManyShrunk
* @param {*} xx
* @param {*} yy
* @param {*} rr
* @param {*} bb
* @param {*} cc
*/
const shrinkPuzzle = (howManyShrunk, xx, yy, rr, bb, cc) => {
for (let i = 1; i <= global_squarePuzzleSize; i++) {
for (let r = 1; r <= global_squarePuzzleSize; r++) {
if (i > xx)
if (i <= global_squarePuzzleSize - rr)
if (r > yy)
if (r <= global_squarePuzzleSize - bb) setLetter(i, r, cc);
}
}
for (let i = 1; i <= global_squarePuzzleSize; i++) {
for (let r = 1; r <= global_squarePuzzleSize; r++) {
if (i > howManyShrunk)
if (i <= global_squarePuzzleSize - howManyShrunk)
if (r > howManyShrunk)
if (r <= global_squarePuzzleSize - howManyShrunk)
setLetter(i, r, cc);
}
}
for (let i = 1; i <= global_squarePuzzleSize; i++) {
for (let r = 1; r <= global_squarePuzzleSize; r++) {
if (getLetter(i, r) == " ") {
setLetter(i, r, "-"); // "-"
} else {
setLetter(i, r, " "); // " "
}
}
}
};
/**
* createManyPuzzles
*
* @param {*} howManyToCreate
* @returns
*/
const createManyPuzzles = (howManyToCreate = 1) => {
let resultsArray = [];
for (let i = 0; i < howManyToCreate; i++) {
makeLetterSet();
let r = createPuzzle();
let lineText = '';
for (var jj = 0; jj < global_squarePuzzleSize; jj++) {
for (var ii = 0; ii < global_squarePuzzleSize; ii++) {
lineText += getLetter(ii + 1, jj + 1) + " ";
}
lineText = '';
}
r.p_data = r.p_data.toUpperCase();
resultsArray.push(r);
}
if (resultsArray.length < 1) {
throw new Error(
"Failed. Usage: createManyPuzzles(number), where number is an Integer > 0"
);
}
return resultsArray;
};
/**
* createPuzzle
*
* @returns
*/
const createPuzzle = () => {
global_wordLetters = "";
global_foundLocations = new Array();
createEmptyPuzzle(global_squarePuzzleSize);
let commas = global_frect;
let ppps = commas.split(",");
shrinkPuzzle(
global_shrinkamt,
Number(ppps[0]),
Number(ppps[1]),
Number(ppps[2]),
Number(ppps[3]),
ppps[4]
);
let ps = global_puzzleshapeoverride;
if (ps !== "") createEmptyPuzzleShape(global_squarePuzzleSize, ps);
global_p_locations = "";
let wordList = global_p_words.split(",");
global_hidden_words = global_p_words.split(",");
let maxBends = global_p_bends;
let pp = "";
if (maxBends < 1) {
pp = global_diagonals;
if (pp == "no") {
global_noDiagonals = true;
} else {
global_noDiagonals = false;
}
}
let howManyHidden = 0;
let missingWords = "";
let hiddenWords = "";
for (let index = 0; index < wordList.length; index++) {
let result = "false";
let attempts = 0;
do {
result = hideWordInPuzzle(maxBends, wordList[index]);
attempts++;
} while (result == "false" && attempts < 6666);
if (result == "false") {
if (missingWords == "") {
missingWords += wordList[index] + "";
} else {
missingWords += "," + wordList[index] + "";
}
} else {
howManyHidden++;
global_wordLetters += wordList[index];
if (hiddenWords === "") {
hiddenWords = wordList[index];
} else {
hiddenWords += "," + wordList[index];
}
}
}
global_p_words = hiddenWords;
fillBlanks(global_blanks);
global_p_data = global_puzzleData;
let result2 = createSqlFromFilledform();
return result2.created;
};
/**
* hideWordInPuzzle
*
* @param {*} bends
* @param {*} theWord
* @returns
*/
const hideWordInPuzzle = (bends, theWord) => {
let testX = randRange(1, global_squarePuzzleSize);
let testY = randRange(1, global_squarePuzzleSize);
let attempts = 0;
do {
testX = randRange(1, global_squarePuzzleSize);
testY = randRange(1, global_squarePuzzleSize);
global_currentPath = new Array();
let diags = false;
global_currentPath = createPath(bends, theWord, diags);
if (attempts > 500) return "false";
attempts++;
} while (makePointsFromPath(testX, testY, theWord) === "false");
if (setPointsFromPath(theWord) == false) {
return false;
}
for (let jj = 0; jj < global_locationsArray.length; jj++) {
if (global_p_locations === "") {
global_p_locations =
global_locationsArray[jj].x + "," + global_locationsArray[jj].y;
} else {
global_p_locations =
global_p_locations +
"," +
global_locationsArray[jj].x +
"," +
global_locationsArray[jj].y;
}
}
return "true";
};
/**
* makePointsFromPath
*
* @param {*} startc
* @param {*} startr
* @param {*} wordToUse
* @returns
*/
const makePointsFromPath = (startc, startr, wordToUse) => {
let sx = startc;
let sy = startr;
global_locationsArray = new Array();
if (global_currentPath.length < 1) return "false";
for (let index = 0; index < global_currentPath.length; index++) {
if (sx < 1) {
global_locationsArray = new Array();
return "false";
}
if (sx > global_squarePuzzleSize) {
global_locationsArray = new Array();
return "false";
}
if (sy < 1) {
global_locationsArray = new Array();
return "false";
}
if (sy > global_squarePuzzleSize) {
global_locationsArray = new Array();
return "false";
}
sx += global_currentPath[index].dx;
sy += global_currentPath[index].dy;
global_point = new Object();
global_point.x = sx;
global_point.y = sy;
if (findPoint(sx, sy) === "true") {
global_locationsArray = new Array();
return "false";
}
if (getLetter(sx, sy) != "-") {
if (global_clueoption == "U") {
global_locationsArray = new Array();
return "false";
} else {
if (getLetter(sx, sy) != wordToUse.substr(index, 1)) {
global_locationsArray = new Array();
return "false";
}
}
}
if (sx < 1) {
global_locationsArray = new Array();
return "false";
}
if (sx > global_squarePuzzleSize) {
global_locationsArray = new Array();
return "false";
}
if (sy < 1) {
global_locationsArray = new Array();
return "false";
}
if (sy > global_squarePuzzleSize) {
global_locationsArray = new Array();
return "false";
}
global_locationsArray.push(global_point);
}
return "true";
};
/**
* setPointsFromPath
*
* @param {*} wordToUse
* @returns
*/
const setPointsFromPath = (wordToUse) => {
let sx = 0;
let sy = 0;
let letter = "";
for (let ii = 0; ii < global_foundLocations.length; ii++) {
if (global_foundLocations[ii] == JSON.stringify(global_locationsArray)) {
return false;
}
}
global_foundLocations.push(JSON.stringify(global_locationsArray));
for (let index = 0; index < global_locationsArray.length; index++) {
sx = global_locationsArray[index].x;
sy = global_locationsArray[index].y;
letter = wordToUse.substr(index, 1);
setLetter(sx, sy, letter);
}
};
/**
* findPoint
*
* @param {*} valX
* @param {*} valY
* @returns
*/
const findPoint = (valX, valY) => {
for (let index = 0; index < global_locationsArray.length; index++) {
if (global_locationsArray[index].x === valX) {
if (global_locationsArray[index].y === valY) {
return "true";
}
}
}
return "false";
};
/**
* createPath
*
* @param {*} maxBends
* @param {*} wordToUse
* @returns
*/
const createPath = (maxBends, wordToUse) => {
let only90DegreeTurns = false;
if (maxBends == 999) only90DegreeTurns = true;
let howMany = wordToUse.length;
global_currentPath = new Array();
global_point = new Object();
global_point.dx = 0;
global_point.dy = 0;
let dx = 0;
let dy = 0;
let isDiagonal = false;
do {
dx = 2 - randRange(1, 3); // -1, 0, 1
dy = 2 - randRange(1, 3); // -1, 0, 1
isDiagonal = dx !== 0 && dy !== 0;
} while (
(!isDiagonal && global_must_be_diagonal) ||
(dx === 0 && dy === 0) ||
(global_noDiagonals === true && dx !== 0 && dy !== 0)
);
let index = 0;
let bendsCount = 0;
let bendFrequency = 500 - maxBends * 50;
do {
if (bendsCount < maxBends) {
if (randRange(1, 1000) > bendFrequency) {
do {
dx = 2 - randRange(1, 3); // -1, 0, 1
dy = 2 - randRange(1, 3); // -1, 0, 1
if (only90DegreeTurns) {
if (Math.abs(dx) == Math.abs(dy)) {
dx = 0;
dy = 0;
}
}
} while (
(dx === 0 && dy === 0) ||
(global_noDiagonals === true && dx !== 0 && dy !== 0)
);
bendsCount += 1;
}
}
index += 1;
global_point = new Object();
global_point.dx = dx;
global_point.dy = dy;
global_currentPath.push(global_point);
} while (index < howMany);
return global_currentPath;
};
/**
* createEmptyPuzzleShape
*
* @param {*} global_squarePuzzleSize
* @param {*} global_squarePuzzleSize
* @param {*} data
* @returns
*/
const createEmptyPuzzleShape = (global_squarePuzzleSize, data) => {
global_puzzleData = data;
let inc = 0;
let charCount = global_squarePuzzleSize * global_squarePuzzleSize;
for (inc = 0; inc < charCount; inc++) {
global_puzzleData += "-";
}
return global_puzzleData;
};
/**
* createEmptyPuzzle
*
* @param {*} global_squarePuzzleSize
* @param {*} global_squarePuzzleSize
* @returns
*/
const createEmptyPuzzle = (global_squarePuzzleSize) => {
global_puzzleData = "";
let inc = 0;
let charCount = global_squarePuzzleSize * global_squarePuzzleSize;
for (inc = 0; inc < charCount; inc++) {
global_puzzleData += "-";
}
return global_puzzleData;
};
/**
* fillBlanks
*
* @param {*} blankCharacters
*/
const fillBlanks = (blankCharacters) => {
let letter = "";
if (blankCharacters == "[WORDLETTERS]") {
blankCharacters = global_wordLetters;
}
if (blankCharacters == "") {
global_letterChoices = "" + makeLetterSet();
} else {
global_letterChoices = "" + blankCharacters;
}
// fail-safe
if (!global_letterChoices || global_letterChoices == "") {
global_letterChoices = "" + makeLetterSet();
}
for (let r = 1; r <= global_squarePuzzleSize; r++) {
for (let c = 1; c <= global_squarePuzzleSize; c++) {
if (getLetter(c, r) === "-") {
letter =
global_letterChoices[
Math.floor(Math.random() * global_letterChoices.length)
];
setLetter(c, r, letter.toLowerCase());
}
}
}
};
/**
* getLetter
*
* @param {*} col
* @param {*} row
* @returns
*/
const getLetter = (col, row) => {
let letterPosition = col - 1 + (row - 1) * global_squarePuzzleSize;
return global_puzzleData.charAt(letterPosition);
};
/**
*
* @param {*} col
* @param {*} row
* @param {*} letter
*/
const setLetter = (col, row, letter) => {
let letterPosition = col - 1 + (row - 1) * global_squarePuzzleSize;
global_puzzleData = setCharAt(global_puzzleData, letterPosition, letter);
};
/**
* setCharAt
*
* @param {*} str
* @param {*} index
* @param {*} chr
* @returns
*/
const setCharAt = (str, index, chr) => {
if (index > str.length - 1) return str;
return str.substr(0, index) + chr + str.substr(index + 1);
};
/**
* createSqlFromFilledform
*
* @returns
*/
const createSqlFromFilledform = () => {
let ArrayOfWords = new Array();
ArrayOfWords = global_p_words.split(",");
let ArrayOfClues = new Array();
for (let ll = 0; ll < ArrayOfWords.length; ll++) {
ArrayOfClues.push("");
}
let ArrayOfLocations = new Array();
ArrayOfLocations = global_p_locations.split(",");
let currentWordLength = 0;
let sumOfLetters = 0;
for (let index = 0; index < ArrayOfWords.length; index++) {
currentWordLength = ArrayOfWords[index].length;
sumOfLetters += currentWordLength;
}
let wordsString = "";
let cluesString = "";
let locationsString = "";
for (let wl = 0; wl < ArrayOfWords.length; wl++) {
if (wl === 0) {
wordsString += ArrayOfWords[wl] + '"';
} else {
wordsString += "," + '"' + ArrayOfWords[wl] + '"';
}
}
let randomLetterChoice;
for (let wl = 0; wl < ArrayOfWords.length; wl++) {
if (ArrayOfWords[wl]) {
if (ArrayOfClues[wl] == "") {
if (global_wordlistoption === 'A') {
randomLetterChoice = 'RSNFD';
randomLetterChoice = randomLetterChoice[Math.floor(Math.random() * randomLetterChoice.length)];
} else {
randomLetterChoice = global_wordlistoption
}
switch (randomLetterChoice) {
case 'R':
ArrayOfClues[wl] = "r_" + reverseString(ArrayOfWords[wl]);
break;
case 'S':
ArrayOfClues[wl] = "s_" + scramble(ArrayOfWords[wl]);
break;
case 'N':
ArrayOfClues[wl] = "n_" + ArrayOfWords[wl].replace(/[aeiouAEIOU]/g, '');
break;
case 'F':
ArrayOfClues[wl] = "f_" + ArrayOfWords[wl][0] + '-'.repeat(ArrayOfWords[wl].length - 1);
break;
default:
ArrayOfClues[wl] = "d_" + ArrayOfWords[wl];
break;
}
}
}
if (wl === 0) {
cluesString += ArrayOfClues[wl] + '"';
} else {
cluesString += "," + '"' + ArrayOfClues[wl] + '"';
}
}
let coordsIndex = 0;
let locarr = new Array();
let coordsPair = '"';
let coordLength = ArrayOfWords.length;
let hasFailed = false;
for (let wl = 0; wl < ArrayOfWords.length; wl++) {
let wordLength = ArrayOfWords[wl].length;
coordsPair = "";
hasFailed = false;
for (let ii = 0; ii < wordLength; ii++) {
coordsPair += ArrayOfLocations[coordsIndex];
if (ArrayOfLocations[coordsIndex] == undefined) {
hasFailed = true;
}
coordsIndex++;
coordsPair += "," + ArrayOfLocations[coordsIndex];
if (ArrayOfLocations[coordsIndex] == undefined) {
hasFailed = true;
}
coordsIndex++;
if (ii < wordLength - 1) coordsPair += ",";
}
if (!hasFailed) {
locarr.push(coordsPair);
}
coordsPair += '"' + coordsPair + '"';
locationsString += coordsPair;
if (wl < coordLength - 1) locationsString += ",";
}
let PuzzleName = global_title_name;
if (PuzzleName == "") PuzzleName = "Untitled Puzzle";
if (compareArrays(ArrayOfWords, global_hidden_words)) {
} else {
hasFailed = true;
arrayDifferences(ArrayOfWords, global_hidden_words);
}
createdPuzzleObject = new Object();
createdPuzzleObject.creator_id = 1;
createdPuzzleObject.id = Date.now();
createdPuzzleObject.creation_datetime = Date.now();
createdPuzzleObject.title = PuzzleName;
createdPuzzleObject.p_pre_msg = global_pre_msg;
createdPuzzleObject.p_post_msg = global_post_msg;
createdPuzzleObject.p_rows = global_squarePuzzleSize;
createdPuzzleObject.p_cols = global_squarePuzzleSize;
createdPuzzleObject.p_data = global_p_data;
createdPuzzleObject.p_bends = global_p_bends;
createdPuzzleObject.p_words = ArrayOfWords;
createdPuzzleObject.p_locations = locarr;
createdPuzzleObject.p_failed = hasFailed;
createdPuzzleObject.p_clues = ArrayOfClues;
createdPuzzleObject.p_wordoptions = global_wordlistoption;
createdPuzzleObject.p_clueoptions = global_clueoption;
return { created: createdPuzzleObject };
};
/**
* makeLetterSet
*
* @returns
*/
const makeLetterSet = () => {
// note: Optimizing by returning the already generated list of letters/frequency table is an enormous speed increase
global_letterChoices =
"HNHIGOWAEYCAEAPLLRCENRLASHEKHTTYPEERNGKNVWTOAECITEYTNARLCENOREDYTEODCIRHSUEWEVOYNNTLASHCOYHYHMHSKNHFPBSONOTCEARECAISATWNSWFENFRDARHTXHSWTUITUKIPTAITTPHTGDINAUNOEIESSSRSOEATTGSAVYAUSTRKWHLADNHIPHBUTDSOKIGHECWDTARHOIATSHDYHOFLEVNMZRNSVIEIHQEVUEFFFAAHDAMTDMLTHAOITSAMLSATWHUSIPIMNBNIALOETDUTMPHIOEEEUGAEAFUTENABERELTOTETREACRAYFVALTYLAIVAHISIATTSUPOMDUMDYFOPDAHEEHRNNAESSSHITENPFYROAERGAMOIEEIVDDRIVRTNHEOHAUADHGSEGSHEPETOLULENCBEIEUUAIANLRELADNRTTLOVTLETBEOTDENTLDGLNBIVIHWITEYHCTYOGATFLOMHOOETAODARABENEITSTDACHNACADAEOODDMNECYTRDATAGTDSEOBIMNLNHAFHGTHNRCOASINHLOOOUSYTERCASHTHHAHISELSPWNEBGKSINFDANIAPUEYIHTLOEWIOIHWTBUAMAHPCRIESLINFANPHANFDNHWEMNWRKOARGEOAHMAEMSIENTIIENHEURUOGNSEOTRRUTCMLDHSSEHIECMMOETTOICMITAAYNHILYELAHOHWNTDINCOAONNCVSACRWNHISACRCNHHIMINPSIMEGASCASHIMLNEUARNTRLHDITSHNFEFFNEATHEEORESVSHFTNENEEGNHSFISECEREAAIEUAHAWTIUCOWEDHITCWALYHSATRHEHRSSSLRDHNTCENEHUDSROTTSDNAANOOOLARSIIYAEORIRISEVRYDACTSIRNENNITHTTAEOOIEEEEISIMECELDLYLDOIETNBTDYASIELEEWYATCODABFITHBFTNCEOTNIUTERMLPOODADESSSTSNTARALELHORINOUOBOEOIARHPNCUURHTIFAHOIOHGPODRRRTUOLWARNMFIWNBNEYHIOIRTOHYNIBELVBEEOKRIRNALENILEDODTTEDNSMHHCRYOEHSHDHAHTGYDVDUHRPNUELTPHTASEAIMFGOSENEONWONURIRPHTLHDEMRAEFTNNLAEMHAFEWAELINSUPVOTIUILEEFNPHVSIOAABCGNLOMREEIYMESAFPWNINHOAWEEITMIUEWDENTSOEEELTNOUHRRTATHTDSWEANDRENAERIUIVIGUURDOURNTTTLLRYOTNIEOIHAHIRKUYATCAHATEYYEFMDWENDFEIAYUYOSITICESAHYTAAAEOTLYFBNGHANTEAHOAOAHNCLEIARMSSIEOENMUNFEKMEEIATTOSESHHRARESASYGSEEMINTEINHMPLOYBOALVEHEECFTTMOSEAOTTINPIERCDMUAOAEDSBAEDRFVETTTEFELNGHLEGAFLEMANONWYTLODIDRFYKNSDTCGIEYHVNUITORKDICFWETTTBYUIREPTRRIYUECDIDMMTGHOHEEEOMREWNPTOHHNLBRHYTEHEATTEWLSISOOEOHMRHSHDINTBAPGORTNOTHNSENHENFSNTPDLEOEMRYNMOTAEVAEMWPRLGBTTLESRTRBIESDEVAWSDKUAIINFUOCAAYNORWICRSIOSAVAWUCCLEESEIWDTDOMHTLOONNALCENHYONRUIOGTHRTNYEECSIGDOHOUWWTHOANDEOTVTSDAACNNTRIORFOEUDOOSAAESSWRSYERSNIMLIDNBRINDIUTMNCENEISONNEEGOMRGEAYINVODMTEURTESFEPERNUTEUENEOARTEOTNIAEEIEITGPALSNUAEPOALOMEOTSRIEEDOAOACDHPUOROFIIBKDNOPGAINDATEBSAKONYNTATHTIXRIAWOLLERCLRTNNNEEETDNFTWUOIGLIROIEFLOEIONPPOAASTDAOKOBCCSOIFSSAEEOENNIDCALCGHLAMIATPITOAFDFSOERTESUVHYYUIEABTROIGLENOADAHATTREEGANBEFREMIRFERHTVRNOYDRENCLHLTIIOEISYOSRAENNRDLWEHSARSLLRWEALGEWOTALBHYAATCOYSUEDFRSNETEDUWLMEISEWTAAILURWUTENORRAEOOSAOTSTIRSDEDHETHOEHNMAPEAPRTOHNEMTUHHSEFPDIMDNMHTUTWCAHLIUIEIDSOILETORSEIFTNAEBOQRGINEMNADPLIKCALDCERIRVNHOFSCNPLTRDEYTLOIUANIRTTRTEEEEEEEIRDNTKCANTSSDNTYERRESHOMVLETERYROEAEIWLMHSOUSKEILHUNNILKMPAODGEMSDBOOWCAREENAOYNANUCMSNTBTCFINTOELSNARETBDVHERMHMPECAPSDLKDUOEIESOUAEILOYTROTEIIDDNTIEZSNSEHESTDCCLTSWCTETTEYWRSIDTIUPOBRARYREEAELEIDIIAYOEOSEOMIEOAIUHDETEVHDHTGRSPTLATRESSHWEDKEEFEDITDEIKSNAINSSETEHNESLLLTHNSTAAWIOSHTEEOSLEGTTIHULGENEAAIOEAISGHNEAEMFINISDEOISVBSTSUGSEHNITMAOXSRTAHOGBAASENECGWDTSVCUOHNLAGHMONLTEWUIFTLDAOLEHOEHNNLALHPWEIOEAERTEANEIRHNAEOROTNYEELHPIIIPLLELFSLHRHEOPTAPPWTRTOHSIATTECETOTEIHHSENKYPIATXNVIDDRELRROSNLOTLANTHTTNOLSINWTUHMLGIDSOVITLMNOUDAAOAASDETLALEHXICDSRAACTGSOLNSANTELRNALURRMNWNSOTLSIACIFATACEUNCGHNADNBDSRINSSNEAIOVMHRRILEOEOAISEEOOINUTSALGSVNMHDODHEONSCRRUIOANTELNWELFOCEAOZRTIHUIDDHAWGTAMRORFETASIAHNTEEGEHTNHIONCETIESDHMPGFIONACNFITTBAHOGTIHSRGRBETCAMOOILAIDLGTIOTEIOAFTOEVSRSECNTAENWOIHGMORWENITSANHTHHIOEDISTSCDLNTEECEADAFIVAECOGEDNSMGEFSNPAOEHREHECGILNASSWGRNTISHRDEDAEONTECALOIOHDTMSNESETRGWHPHFSRRLTEGSSIIVITUETOTIACHAYHUSFFAFIDEIOTUYIYTWETGEGAWIALRARLRAMTNTMUEYEDNOLYSGQSASHUONYGAAEOENOFTTTDTIWGAHDSIETBOOAYSLHIDWTWDEDOVHAUNIOTGWNDLBMREPTNECIYARBNTUIEEEEERRSNOBGAYSEEESDETSUTHNDODRNGEIWUSCAOSNEHEUACEHREIERHTLWAOCEGREEDIERTPMWHHCGEUIENNARIHRYSRHAUONENHILNHWMEIPMRLPOTDIULHSNAIAEOEEGHSAOMRASIAOYOTYWTEMESTSIOARTTCNTLTAGEETERFOEHTEMIMSACDAODHHEMURNARADOSOTAENYITOAWIEHEOEOTEROSMDETMFWMENCITDEMSAHWAAEAUNOINUUESHFDIIRMHUEYHESTAEBEEHERBWCDALETTSMREMCAOIOFAOOBTTELTPTAERYTDAILTSDEBHLSTIYRWNDGLGKANPSTCHALETENMRVTGMINAYEINHARWKSYSAIHIAAUUZAIETHTLGVNAEGSONETSDGPIYAMDHNHGTLRDTTEFTEDNOWOHIFHEETHOKNISTDLAEWEEYULHFWOOMEDEUPTWENYENANTIUTNSTAIISTBEFFIBTIPOVORDTPNEULAHHACRRNELYAISEALPOAITEMIHNATAOLBNNGRSCMIITWLTESASLBEERSIDLLAWRSRTKYUYTHHOIAATEHILPASREIRRBOCDCHTEONBIHHEYAAMDRASORAUAFYRINTEUIEVRSVAHUIATTTHXNTIRSDELEYOTSINLCHHSCGRIYRTRORBERIXIMRTHSINSSGATPYISITEBENLOOREIIWDANBSHLENUHESICGEVYHEIWTTNSTOHETATETTNRFNRABWEAIWONIEORORTYTRURHAOHOLEEPFSAOTTEBIHEUAEUEOXYYESRRPAGARBTITHWTEEEDTEERRUNIYIIMAEALIRLCRGVHSWHOHNCRMAVYITLNMTIAETSTROEROEACPMLURTTEENOSRSNHDWELHSEBEASNRETSTTRONNNNNOAORLHDDCPOTRARBHIHTVMNNKSDROLIAOOCEESNEROIETDEUTMEEOEHTTWDREMRSOHESHEERKOSTTRPOIESGSRGGAYTNOAAEERRRTSGOIEHDRSNIAUNOTIDSZLSIELHNININFGTMEAERRHOWILEOAOCWUGEEONOLIRDMTENBOXCTEPSEAGFOTTYUALCSDLNUIATPRWCASEHAVHFCDOFXIIEORWACMTHPFHNNTAACHLSPDSHSOVCERNARGYTHEEPOORTFTEEEHENIEEHFOEGEESHAEONAEELTRACELTALOOLNBHTRHOEERMEUNRHELILTNRYDFEIBEIMDRTAUAEHTAOECTSSOIEHRREDEEMREHATCRWEDVRLMGOMATPMIHFPNOSNAQTTOEOHFLTBHIEFDDSRTAEKNUCQKNFNIYEEOROIGMTECOCEURIROATOTTNNALUPEGTTUUANTADIOLAASITIBTTSEEAEAUAFRHDIHSAEDSEEORLHINENSCHREAIHFNNMIRSIRHICGTDESTFMNHLMARNSOLIEEICECCVTDTHTHSATEULSEOYKHAATCOTEFTAHUAINREENSEIFSGYTDAAFRSMIAAELNHDGTCHEASIHNTFIAEYTEDMHEBEEHUHATTNYRCHOLSENCOFEYOSWUEOGYOANTTIFDEUOOXHIHHANKIYRDHAIVOUARSEWTGIRNEENHGSKWIYEINCIANTEHSTTETEOAEASMNBODOITUEEIOTITTCRTAEEHTERPGOFNDGOAVRIIWLTOSMHEEDVFSTETDIFANNUNETNOHEHUENIAYMVTOGNBTONEATNRGOLUTIAOEHRSONDMSOGHSEDIAUCIDEBUTBJIAATNANTTILSCRAEFENCTTNVOEIEHNEDFAOUERIESABTCTNBSETEAATIINNCOADNDOENPFANHEIEAEPLEGISIORWEAAIAODOTESPLWSONIYNTNLVESSMNUOJLBTTTVMRRWGEALEHSADTAAMIANSBSUEONMGBUNIENDSITLHHHAAAINVPRENYIALYFOHOYSSSALAERRRCAIEEEAIFDCNOSEGOREHEYOIICOBVRAVMSCROEOHICOLSEOTAHAHEYITLNRLALNCOREOOIIYNOGWILEAEADINGLTESDEDXNISNTESHONESSNEAIAENNNGOUDLGETUSYTAGWKKSLNIERMNNNITRHTDISFINDPTAAELASOUUMBIRITIESRIOOMSHEIIOALDRDSUGADOELIRESWMNOSHEIRNVTAFHTAHOOOOOEEDSEHTAHOESMHNDESNIILICSDHTEYMAUOWNEOECENECISHETLASOSRHEHOPSEOIRFIEUTYRHEIAHTINETPANSTBLSMHTRITINTEOEADSDEXANFVNDYOIEDNPPITNYLMEASTWYEGUNHAEOEBNNRIKEDANOSTETSTEGSNTHIEDMIEUIHPYISHEUEABHRSHTSHESAWPNTHGEOURTDETATSANSETCYEOMLTACTSNOSREETHVRMFTLPSLPOUFHNEUESNADHHWDAVLENIDNONDCUEJDHIMNCDADCSSTHADEBRWSOYHIECRLDDERDTNWNULDEZLVITRJIEAITMTTISSAAOAVTNBAEHHIEENELNEDTDILTLDRREOTOKAOARAAUEANRBIGATLESOALRTJEAISAYIMDITUDDDGSRLBSVBEOOUENOEEHKLRPAREWFNEREPIOELOMOEWRFNSLMHIOEORTBELEDNOTWEHDAFFONDTSNEEIFRHTEIIETANFEPSCSOYOUAESOANETMRBCRRATNFRTSTSFWOWTOHRHRIOREAHASFDAHOVRESANHEEHENOMYISNEHSNCIECPUUOEDOUEIASIHNEFULLHREDERDESDHUBDOLDENYYVAROERABRGAENTASTUDTLIBCIOSNGMTATLAHBIVNPHTEADATDEDNRIEEEDMINIUTTRAVOAHRCOHSRHOTNOETNEHFMTOLRIOHUSACWYHFWYHMGMWRNAIANERROTONCFUHEMBOAIOEYDANUAYSLTOBEAMHTOVHNOPPAIEOOTIAIAROVMFLWIDTGTTHHSVTINATRTRLSRDGGRAITNPELUFTWESHALNMOETASTSSLAHNPPDTDBTUISTERIETCDALNINTIOCYNLGPLEETALRLSSAHYENNENUATTEADELLAENEOETYNFYGPNTEDTRWDOSWLDPDTOFSRTUDYBTAVIELOSEHLMTGOBESINERESTRAUEMRTTEOLTEEMEHOUPIEAAENHEEASGRNUMRENEOASLETLOHOBLETRDVBCLPGSWEAOSOHACTNAAAOCDLOONRPFEIIWCPHIMSROCSVUANEUOHMEISICHAATYEOVLIORPTROHMETETNTGIIENEANEOHTAISBEOEEEHTETWPBSRDCENAAFUDRLRTYRNTITULOOHEHATNTIETYTTVWSCDRAAHCYCFGIDIESSONOTASAOIJARCYOWEIMSSYGETTEWSDLAFVRNWAWEPEDTFQURIIOGWAANDNHWOHHOSLEQNWAOMOASDFOTONTHTNDSMETLTRSSNETNDWOOKOTPUEIHDEKNLKUAEARWHDRRATHEONALHTCNHLLRNHRLVIYVUIAWOEDIAOIUKAOTHDUOUSNIWMEOMTTLIAYBNHREASJFMKEDALKIROETULNGKYALIIEOILODNITRETMRFCOTCDETHMIRETONGGYTLSECORIAIHTITHDLHNEEAEHOYSTEEFDTSIINSTRMTUIEDSFOEEPILWHITAAOWENFATOFBCURFHREHITUACAOARLPTDRTDOEOSTCWTNEHOTNHGOOAEEATOEHEHRMTARETPUTPEEYHEHTEAOAIRHOKTNEETLIOTNYOUNEREIKTOUURALAMUSLSDHEATTHRESEATEDARERSELSORTEVNIAONEDREIEEOEEHHNSLLTOEIWIHORECSLPWTEETDTLDALHINMRUONONNMNLAHTSFOCLYTAOEENIAVMRDORNIALMLADDODORFHIBGSARRHGDBOTTHENEFTEITTLAWTAAEOEMNOEEBIEFNNXOPRAOTNSHLIRIIFHOHOCHIAHYRTESHOOIDESTTOSNOSCIOLFRCTISTPIRERTEENAYIOMHOSOATLIARWSASDOEHIAYUITROHDAPOATSHECEEWHTITOPITOUCTRTFTNRETOSROSRTSYARHRWHSSODLLBCEASTTWEEYBRMTBCHIINRTTATOASONASDOOUEGUNBRAPTATHNAESLECTOSHTOESNDTEYRPEVYOLMEIWFASDIAESRGDSEEEFUPRFGMHSDTWPDERRSMNEULYERNHILWNOIAOHSILENRCVIFICWSIEEHONOUANAASREASKNTNIDKBBUODRIVDETEOATEIDMTFGTIATMATNHLIIFEYSERECHOMTLHLEMHBMOARFUNIOMTYORAOLEOITRPMSTNOHAHEEOAOAALAUMTNGDTFHDENORERLVGSEMUTUATISLETTFHHTEISEITCDSTFCSUENOOCTDFPBMUFOEORNSFCTAMWNLONPLIGSLLENEIYOOHESCEEAGDAREHIIOHEERHLENOOYOROEIVTDTSGOINYEALMFWUDHLTIAJONSOTETPCUDODHTITTSGOINSHNDISOOBAECBQTRGTAIOIAWIHTOEHOCLAEOSSAANFHADSNPOHOIPSASREGLSFPOIRCBETUNTARISOVNOEOSOLHTEONIROAEUUNATIMZAIIOBTTSESOOEMMKHMIEEPTBAGSTABUURANCEEESEAHOREACNNNPMWESAAAROINLIETLEEIVATCSEOASROROETONIATONTVCBENNOTEVOSETGTSUUEYWIILIEBHFELFNESFTTKCFHTIITOFHHLTODIERDSNDSETHLPMIIWUTNRHFBNENATIEAUTFTCOORDAFTETHACVODTMARTGHTWDIRMFIADITIETBHTREATEPIHYOECTHOTRDEHSVGOIMHOOGMNSMEFACOSCWNLPTNISTECEDDITREEREFSNKERODVNRDIOOUFNHNFNOMBWHHUTEUEWENDTTNWNFNEFTATTOSRMAORAYRWSHLTTTBAFSDITIEHTMEESREHLRHOWDDRPSGSRLPOYCMFOPEBSMOTSENPLDISRAAIOEWMHMOELFPAATRDOIHLOIRATNCTAPIDRTBINFWNTSKUEPHEOWISMAEEINPWSTTLYDIHPAAAYGEIHONLNAMSIAOIHQLFCUNGNHNHKKIHOGDRUBSYTUYONAAHASERORUTEONDTAAHOSORADRRAOASYREOSITECSHNEHAESEESOTTEIWEHAACPTDGAUTETSETIRAEHTEINFEWENETATUUNARIGBDOEFGTSAFHEOITAAGUTMIEOEFSKOALTRINOTFDRENNELEBHYTSSECNYOMEEWIASNTTSRRNRAWCLUIAOETUDLDROTOTOITOTNEENHAIVELDTBECEEDYIIUNUYTULIDSWYECTSOHRFICRIFYDWGAAURHEEELPDHDVSTATEATDAHNVVOTHLCSEUOSOTEOATHSAPGSENBOMNRASNIREDCAOTROCAFGNRDEBAUODAMEAYRENHNDAIHITOSCWFICREMTNKEHSTTGTIFRTTSFNGFTAAANNSANELLARSMAIPCUEDGSENSSHSSLUEWENAHDNEGERAAASADDSHDTISLRARLOAIEEEMOHAAOEAEIRATONIRERETNTCEISNOSTDPRNNGOITAEFRIOOEAANFWAANETSNTEIGOELEAEKWTACSSNEYHRAFGYAMIHUONHEWOTEIOOIRSRRMCTNBWIRSIGGTWOTFSRIFOIAOHATKSLHNDEOQOIINTINREMSOYFNAOCITRTEAENFPOILSOIRGCUTNNRAIHHMTROHENRSNNSOPDCSUCOSIDADISEATPTAOVITTXLMDSORNMIEHIOROONDKIRPPTDJEEOXIRULHPPDUEIHPTAUCOIETNGIQWOEROYMLFRCLHETREMDRSREONHUATDLYNELLWYNNWOUTIPRAYGTEANEATNWTNXPACSUERRRENFSLMSIERNSOATIEAECHCHOIDEOTLNREADAAUBEASFMOYFCOTNIITAOMDAEOFEADAURSWIIEUDNOILDDANKYFTRNNDYTTEDTITSCELIHETATODPEEDDYRAGSCSOYHWEIDEIIECSDERDGRTTHETKLIOTIRISLLHHNDTOLMNDCINFERAOAFWENYGERSNHYERURCIDUIEUEAEEESULDICRBIPDGFCICLDPNTWGWLOTNROULHSHSERANDRHYEDHPOEDDTMUHTAEWODDBNRDLGISKHVHFHSMSWISDSCBUUURANSADTTCNEESNTTHNVHINHRPCEOSIROEIYFAUEMMEIHINHRLESFICTTSOWSRRHSVAEIYCIRDIHRHKNREEANCOUTGURHMEFKMRKEPFSSMTWHWOEITWISMAADGMOSEBRDETLUOCHHEOPRTTRIUPMIMTHAASRHSYAHTUNHHOTATNOSAOREORFSEIOHFYNTBIIMNSHSAHEEGETLAICPWESUTABFNPEHIERRCSTEGNIIISUSTINEDLEBHATSWORENSPCCEOREJABLERTUOTNS";
return global_letterChoices;
// note: The code to create this list of letters is commented out below.
// let commonLetters = [
// "E",
// "T",
// "A",
// "O",
// "I",
// "N",
// "S",
// "R",
// "H",
// "D",
// "L",
// "U",
// "C",
// "M",
// "F",
// "Y",
// "W",
// "G",
// "P",
// "B",
// "V",
// "K",
// "X",
// "Q",
// "J",
// "Z",
// ];
// let letterFrequency = [
// 1202, 910, 812, 768, 731, 695, 628, 602, 592, 432, 398, 288, 271, 261, 230,
// 211, 209, 203, 182, 149, 111, 69, 17, 11, 10, 7,
// ];
// global_letterChoices = "";
// for (let i = 0; i < 26; i++) {
// for (let j = 0; j < letterFrequency[i] * 1; j++) {
// global_letterChoices = global_letterChoices + commonLetters[i];
// }
// }
// global_letterChoices = scramble(global_letterChoices);
// return global_letterChoices;
};
module.exports = {
createManyPuzzles,
setGlobalOptionValue,
};