wordle-shell
Version:
A Wordle for the command line
103 lines (102 loc) • 3.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CharState = void 0;
var CharState;
(function (CharState) {
CharState[CharState["Correct"] = 0] = "Correct";
CharState[CharState["Misplaced"] = 1] = "Misplaced";
CharState[CharState["Wrong"] = 2] = "Wrong";
CharState[CharState["Unknow"] = 3] = "Unknow";
})(CharState = exports.CharState || (exports.CharState = {}));
class Wordle {
constructor(wordPicker) {
this.ensureWordLength(wordPicker.getWord());
this.word = wordPicker.getWord();
this.words = wordPicker.getWordList();
}
ensureWordLength(word) {
return word.length === Wordle.words_size;
}
static done(states) {
return states.every((state) => state === CharState.Correct);
}
static get_word_size() {
return this.words_size;
}
checkIfMisplaced(guess, states, index) {
if (states[index] !== CharState.Unknow) {
return false;
}
const qtd_chars_guess = guess
.slice(0, index + 1)
.split("")
.reduce((sum, char) => {
return sum + (char === guess[index]
? 1
: 0);
}, 0);
const qtd_chars = this.word
.split("")
.reduce((sum, char, internal_index) => {
return sum + (char === guess[index] && states[internal_index] !== CharState.Correct
? 1
: 0);
}, 0);
return qtd_chars >= qtd_chars_guess;
}
checkAllCorrets(guess, states) {
var _a;
for (let index = 0; index < Wordle.words_size; index++) {
const word_char = this.word.at(index);
const guess_char = (_a = guess.at(index)) !== null && _a !== void 0 ? _a : "?";
if (word_char === guess_char) {
states[index] = CharState.Correct;
}
}
return states;
}
checkAllMismatches(guess, states) {
for (let index = 0; index < Wordle.words_size; index++) {
if (this.checkIfMisplaced(guess, states, index)) {
states[index] = CharState.Misplaced;
}
}
return states;
}
checkAllWrongs(states) {
for (let index = 0; index < Wordle.words_size; index++) {
if (states[index] === CharState.Unknow) {
states[index] = CharState.Wrong;
}
}
return states;
}
createStates() {
let states = Array(Wordle.words_size);
for (let index = 0; index < Wordle.words_size; index++) {
states[index] = CharState.Unknow;
}
return states;
}
checkWord(guess) {
if (!this.ensureWordLength(guess)) {
throw new Error("Word is the wrong length");
}
if (!this.ensureWordPossible(guess)) {
throw new Error(`${guess} is not on the list`);
}
let states = this.createStates();
this.checkAllCorrets(guess, states);
this.checkAllMismatches(guess, states);
this.checkAllWrongs(states);
return states;
}
ensureWordPossible(guess) {
return this.words.includes(guess);
}
getWord() {
return this.word;
}
}
Wordle.words_size = 5;
exports.default = Wordle;