Skip to content

Instantly share code, notes, and snippets.

@breqdev
Created February 14, 2022 16:15
Show Gist options
  • Save breqdev/6ae5e732da5fb6d21ea3ad1d0a228571 to your computer and use it in GitHub Desktop.
Save breqdev/6ae5e732da5fb6d21ea3ad1d0a228571 to your computer and use it in GitHub Desktop.
type LetterGuess = {
letter: string;
color: "gray" | "yellow" | "green";
};
let guess = "...";
let target = "...";
// Store the color alongside each guess letter
let guessLetters: LetterGuess[] = guess.split("").map((letter) => ({
letter,
color: "gray",
}));
// Store the target in an array of nullables
let targetLetters: (string | null)[] = [...target];
// First pass: match green letters
guessLetters = guessLetters.map(({ letter, color }, index) => {
// green letters are matched by the specific index in the target
if (letter === targetLetters[index]) {
// remove matching green letters from the pool
// so that they aren't also matched as yellows
targetLetters[index] = null;
return { letter, color: "green" };
} else {
return { letter, color };
}
});
// Second pass: greedily match yellow letters
guessLetters = guessLetters.map(({ letter, color }) => {
if (color === "green") {
// don't modify existing green letters
return { letter, color };
}
// yellow letters are matched by searching the entire target word
else if (color === "gray" && targetLetters.includes(letter)) {
// remove yellow letters once matched,
// each letter only matches once
targetLetters[targetLetters.indexOf(letter)] = null;
return { letter, color: "yellow" };
} else {
return { letter, color };
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment