2022-01-01 02:04:48 +00:00
|
|
|
export enum Clue {
|
|
|
|
Absent,
|
|
|
|
Elsewhere,
|
|
|
|
Correct,
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface CluedLetter {
|
|
|
|
clue?: Clue;
|
|
|
|
letter: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function clue(word: string, target: string): CluedLetter[] {
|
2022-01-01 18:35:03 +00:00
|
|
|
let elusive: string[] = [];
|
|
|
|
target.split("").forEach((letter, i) => {
|
2022-01-01 02:04:48 +00:00
|
|
|
if (word[i] !== letter) {
|
2022-01-01 18:35:03 +00:00
|
|
|
elusive.push(letter);
|
2022-01-01 02:04:48 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
return word.split("").map((letter, i) => {
|
|
|
|
let j: number;
|
|
|
|
if (target[i] === letter) {
|
|
|
|
return { clue: Clue.Correct, letter };
|
2022-01-01 18:35:03 +00:00
|
|
|
} else if ((j = elusive.indexOf(letter)) > -1) {
|
|
|
|
// "use it up" so we don't clue at it twice
|
|
|
|
elusive[j] = "";
|
2022-01-01 02:04:48 +00:00
|
|
|
return { clue: Clue.Elsewhere, letter };
|
|
|
|
} else {
|
|
|
|
return { clue: Clue.Absent, letter };
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function clueClass(clue: Clue): string {
|
|
|
|
if (clue === Clue.Absent) {
|
|
|
|
return "letter-absent";
|
|
|
|
} else if (clue === Clue.Elsewhere) {
|
|
|
|
return "letter-elsewhere";
|
|
|
|
} else {
|
|
|
|
return "letter-correct";
|
|
|
|
}
|
|
|
|
}
|