honigle/src/lib/statuses.ts

103 lines
2 KiB
TypeScript
Raw Normal View History

2022-01-09 17:06:37 -05:00
import { solution } from "./words";
export type CharStatus = "absent" | "present" | "correct";
export type CharValue =
| "Q"
| "W"
| "E"
| "R"
| "T"
| "Y"
| "U"
| "I"
| "O"
| "P"
| "A"
| "S"
| "D"
| "F"
| "G"
| "H"
| "J"
| "K"
| "L"
| "Z"
| "X"
| "C"
| "V"
| "B"
| "N"
| "M";
export const getStatuses = (
guesses: string[]
): { [key: string]: CharStatus } => {
const charObj: { [key: string]: CharStatus } = {};
guesses.forEach((word) => {
word.split("").forEach((letter, i) => {
if (!solution.includes(letter)) {
// make status absent
return (charObj[letter] = "absent");
}
if (letter === solution[i]) {
//make status correct
return (charObj[letter] = "correct");
}
if (charObj[letter] !== "correct") {
//make status present
return (charObj[letter] = "present");
}
});
});
return charObj;
};
2022-01-09 21:02:41 -05:00
export const getGuessStatuses = (guess: string): CharStatus[] => {
const splitSolution = solution.split("");
const splitGuess = guess.split("");
2022-01-09 21:02:41 -05:00
const solutionCharsTaken = splitSolution.map((_) => false);
2022-01-09 21:02:41 -05:00
const statuses: CharStatus[] = Array.from(Array(guess.length));
// handle all correct cases first
splitGuess.forEach((letter, i) => {
2022-01-09 21:02:41 -05:00
if (letter === splitSolution[i]) {
statuses[i] = "correct";
2022-01-09 21:02:41 -05:00
solutionCharsTaken[i] = true;
return;
}
});
splitGuess.forEach((letter, i) => {
if (statuses[i]) return;
2022-01-09 21:02:41 -05:00
if (!splitSolution.includes(letter)) {
// handles the absent case
statuses[i] = "absent";
2022-01-09 21:02:41 -05:00
return;
}
// now we are left with "present"s
const indexOfPresentChar = splitSolution.findIndex(
(x, index) => x === letter && !solutionCharsTaken[index]
);
2022-01-09 21:02:41 -05:00
if (indexOfPresentChar > -1) {
statuses[i] = "present";
2022-01-09 21:02:41 -05:00
solutionCharsTaken[indexOfPresentChar] = true;
return;
} else {
statuses[i] = "absent";
2022-01-09 21:02:41 -05:00
return;
}
});
return statuses;
};