honigle/src/lib/statuses.ts

103 lines
2 KiB
TypeScript
Raw Normal View History

2022-01-16 15:11:27 +04:00
import { solution } from './words'
2022-01-09 17:06:37 -05:00
2022-01-16 15:11:27 +04:00
export type CharStatus = 'absent' | 'present' | 'correct'
2022-01-09 17:06:37 -05:00
export type CharValue =
2022-01-16 15:11:27 +04:00
| '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'
2022-01-09 17:06:37 -05:00
export const getStatuses = (
guesses: string[]
): { [key: string]: CharStatus } => {
2022-01-16 15:11:27 +04:00
const charObj: { [key: string]: CharStatus } = {}
2022-01-09 17:06:37 -05:00
guesses.forEach((word) => {
2022-01-16 15:11:27 +04:00
word.split('').forEach((letter, i) => {
2022-01-09 17:06:37 -05:00
if (!solution.includes(letter)) {
// make status absent
2022-01-16 15:11:27 +04:00
return (charObj[letter] = 'absent')
2022-01-09 17:06:37 -05:00
}
if (letter === solution[i]) {
//make status correct
2022-01-16 15:11:27 +04:00
return (charObj[letter] = 'correct')
2022-01-09 17:06:37 -05:00
}
2022-01-16 15:11:27 +04:00
if (charObj[letter] !== 'correct') {
2022-01-09 17:06:37 -05:00
//make status present
2022-01-16 15:11:27 +04:00
return (charObj[letter] = 'present')
2022-01-09 17:06:37 -05:00
}
2022-01-16 15:11:27 +04:00
})
})
2022-01-09 17:06:37 -05:00
2022-01-16 15:11:27 +04:00
return charObj
}
2022-01-09 21:02:41 -05:00
export const getGuessStatuses = (guess: string): CharStatus[] => {
2022-01-16 15:11:27 +04:00
const splitSolution = solution.split('')
const splitGuess = guess.split('')
2022-01-09 21:02:41 -05:00
2022-01-16 15:11:27 +04:00
const solutionCharsTaken = splitSolution.map((_) => false)
2022-01-09 21:02:41 -05:00
2022-01-16 15:11:27 +04: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]) {
2022-01-16 15:11:27 +04:00
statuses[i] = 'correct'
solutionCharsTaken[i] = true
return
2022-01-09 21:02:41 -05:00
}
2022-01-16 15:11:27 +04:00
})
splitGuess.forEach((letter, i) => {
2022-01-16 15:11:27 +04:00
if (statuses[i]) return
2022-01-09 21:02:41 -05:00
if (!splitSolution.includes(letter)) {
// handles the absent case
2022-01-16 15:11:27 +04:00
statuses[i] = 'absent'
return
2022-01-09 21:02:41 -05:00
}
// now we are left with "present"s
const indexOfPresentChar = splitSolution.findIndex(
(x, index) => x === letter && !solutionCharsTaken[index]
2022-01-16 15:11:27 +04:00
)
2022-01-09 21:02:41 -05:00
if (indexOfPresentChar > -1) {
2022-01-16 15:11:27 +04:00
statuses[i] = 'present'
solutionCharsTaken[indexOfPresentChar] = true
return
2022-01-09 21:02:41 -05:00
} else {
2022-01-16 15:11:27 +04:00
statuses[i] = 'absent'
return
2022-01-09 21:02:41 -05:00
}
2022-01-16 15:11:27 +04:00
})
2022-01-09 21:02:41 -05:00
2022-01-16 15:11:27 +04:00
return statuses
}