Skip to content

Commit

Permalink
🐛 Samantha is an Algorithm GOAT
Browse files Browse the repository at this point in the history
  • Loading branch information
nickhudkins committed Jun 30, 2024
1 parent c2a6461 commit 05f3407
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 18 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 23 additions & 17 deletions packages/server/src/handlers/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,6 @@ const FOUND = 2;
const EXISTS = 1;
const NOT_FOUND = 0;

const EXACT_MATCH_TOKEN = "☑";
const ALREADY_FOUND_TOKEN = "␣";

export function getLetterState(
correctWord: string,
guessWord: string
Expand All @@ -85,27 +82,36 @@ export function getLetterState(
const correctLetters = [...correctWord];
const guessLetters = [...guessWord];

for (let i = 0; i < guessLetters.length; i++) {
const guessedLetter = guessLetters[i];
if (guessedLetter === correctLetters[i]) {
// Mark found in letterState
const ocurrences = correctLetters.reduce((acc, curr) => {
acc[curr] = (acc[curr] ?? 0) + 1;
return acc;
}, {} as Record<string, number>);

// Correct Letter Pass
for (const [i, guessedLetter] of guessLetters.entries()) {
const correctLetter = correctLetters[i];
if (guessedLetter === correctLetter) {
letterState[i] = FOUND;

// Replace in correctLetters to avoid
// finding the letter again
correctLetters[i] = EXACT_MATCH_TOKEN;
// Decrement occurences.
ocurrences[guessedLetter] -= 1;
}
}

for (let i = 0; i < guessLetters.length; i++) {
const guessedLetter = guessLetters[i];
const existsIndex = correctLetters.indexOf(guessedLetter);
if (existsIndex >= 0) {
// Replace the found letter in correctLetters
// to avoid finding the letter again.
correctLetters[existsIndex] = ALREADY_FOUND_TOKEN;
for (const [i, guessedLetter] of guessLetters.entries()) {
// Don't ever replace a found letter.
if (letterState[i] === FOUND) {
continue;
}

const existsInWord = correctLetters.includes(guessedLetter);
const hasOcurrences = ocurrences[guessedLetter] > 0;

if (existsInWord && hasOcurrences) {
letterState[i] = EXISTS;
ocurrences[guessedLetter] -= 1;
}
}

return letterState;
}
10 changes: 10 additions & 0 deletions packages/server/src/handlers/getLetterState.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,13 @@ test("handleCheckWord: Valid, Multi-Guess, Multi-Just-Found", () => {
const letterState = getLetterState("SHEAR", "ERASE");
expect(letterState).toEqual([1, 1, 1, 1, 0]);
});

test("handleCheckWord: Valid, Multi-Guess, Multi-Exact", () => {
const letterState = getLetterState("TAFIA", "TIBIA");
expect(letterState).toEqual([2, 0, 0, 2, 2]);
});

test("handleCheckWord: Valid, Multi-Guess, Single-Just-Found, Multi-Exact", () => {
const letterState = getLetterState("TIBIA", "TAIIA");
expect(letterState).toEqual([2, 0, 1, 2, 2]);
});

0 comments on commit 05f3407

Please sign in to comment.