honigle/src/lib/statuses.ts
2022-01-16 15:11:27 +04:00

102 lines
2 KiB
TypeScript

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
}
export const getGuessStatuses = (guess: string): CharStatus[] => {
const splitSolution = solution.split('')
const splitGuess = guess.split('')
const solutionCharsTaken = splitSolution.map((_) => false)
const statuses: CharStatus[] = Array.from(Array(guess.length))
// handle all correct cases first
splitGuess.forEach((letter, i) => {
if (letter === splitSolution[i]) {
statuses[i] = 'correct'
solutionCharsTaken[i] = true
return
}
})
splitGuess.forEach((letter, i) => {
if (statuses[i]) return
if (!splitSolution.includes(letter)) {
// handles the absent case
statuses[i] = 'absent'
return
}
// now we are left with "present"s
const indexOfPresentChar = splitSolution.findIndex(
(x, index) => x === letter && !solutionCharsTaken[index]
)
if (indexOfPresentChar > -1) {
statuses[i] = 'present'
solutionCharsTaken[indexOfPresentChar] = true
return
} else {
statuses[i] = 'absent'
return
}
})
return statuses
}