Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 34x 34x 34x 34x 34x 1x 1x 1x 1x 1x 51x 51x 1x 1x 1x 1x 1x 21x 21x 21x 21x 21x 21x 19x 19x 19x 19x 19x 21x 21x 1x 1x 1x 1x 1x 27x 27x 27x 27x 27x 27x 25x 25x 27x 23x 23x 27x 14x 14x 14x 14x 14x 14x 8x 8x 8x 8x 1x 1x 1x 1x 1x 16x 16x 16x 16x 16x 16x | /**
* Utility functions for memory quiz input validation and prefix handling
*/
/**
* Check if an input string is a prefix of any numbers in the target list,
* excluding already found numbers
*/
export function isPrefix(input: string, targetNumbers: number[], foundNumbers: number[]): boolean {
// Original logic: check if input is a prefix of any unfound numbers
return targetNumbers
.filter((n) => !foundNumbers.includes(n)) // Only consider unfound numbers
.some((n) => n.toString().startsWith(input) && n.toString() !== input)
}
/**
* Check if an input could be a valid prefix of any target numbers
*/
export function couldBePrefix(input: string, targetNumbers: number[]): boolean {
return targetNumbers.some((n) => n.toString().startsWith(input))
}
/**
* Validate if an input represents a complete wrong number
*/
export function isCompleteWrongNumber(
input: string,
targetNumbers: number[],
_minLengthForWrong: number = 2
): boolean {
const number = parseInt(input, 10)
if (Number.isNaN(number)) return false
const isNotTarget = !targetNumbers.includes(number)
const cannotBePrefix = !couldBePrefix(input, targetNumbers)
// It's a complete wrong number if it's not a target AND it cannot be a prefix of any target
return isNotTarget && cannotBePrefix
}
/**
* Determine if input should trigger an incorrect guess
*/
export function shouldTriggerIncorrectGuess(
input: string,
targetNumbers: number[],
_foundNumbers: number[],
hasGuessesRemaining: boolean = true
): boolean {
if (!hasGuessesRemaining) return false
const number = parseInt(input, 10)
if (Number.isNaN(number)) return false
// Don't trigger if it's a correct answer (even if already found)
if (targetNumbers.includes(number)) return false
const couldBeValidPrefix = couldBePrefix(input, targetNumbers)
// Trigger if it clearly cannot be a valid prefix of any remaining target number
// For multi-digit inputs that ARE valid prefixes, don't trigger (user may still be typing)
if (couldBeValidPrefix) return false
// Not a prefix and not a target — it's wrong
return true
}
/**
* Check if a number is correct and available to be guessed
*/
export function isCorrectAndAvailable(
number: number,
targetNumbers: number[],
foundNumbers: number[]
): boolean {
return targetNumbers.includes(number) && !foundNumbers.includes(number)
}
|