const GERMAN_NUMBER_WORDS = new Map([ ['null', '0'], ['ein', '1'], ['eins', '1'], ['eine', '1'], ['einen', '1'], ['einem', '1'], ['einer', '1'], ['zwei', '2'], ['drei', '3'], ['vier', '4'], ['fuenf', '5'], ['funf', '5'], ['fünf', '5'], ['sechs', '6'], ['sieben', '7'], ['acht', '8'], ['neun', '9'], ['zehn', '10'], ['elf', '11'], ['zwoelf', '12'], ['zwolf', '12'], ['zwölf', '12'], ['dreizehn', '13'], ['vierzehn', '14'], ['fuenfzehn', '15'], ['funfzehn', '15'], ['fünfzehn', '15'], ['sechzehn', '16'], ['siebzehn', '17'], ['achtzehn', '18'], ['neunzehn', '19'], ['zwanzig', '20'], ['dreissig', '30'], ['dreißig', '30'], ['vierzig', '40'], ['fuenfzig', '50'], ['funfzig', '50'], ['fünfzig', '50'], ['sechzig', '60'], ['siebzig', '70'], ['achtzig', '80'], ['neunzig', '90'], ['hundert', '100'], ['einhundert', '100'], ['tausend', '1000'], ['eintausend', '1000'], ['zweitausend', '2000'] ]); const GERMAN_ONES = [ ['', ''], ['ein', 'eins'], ['zwei'], ['drei'], ['vier'], ['fuenf', 'funf', 'fünf'], ['sechs'], ['sieben'], ['acht'], ['neun'] ]; const GERMAN_TENS = { 20: ['zwanzig'], 30: ['dreissig', 'dreißig'], 40: ['vierzig'], 50: ['fuenfzig', 'funfzig', 'fünfzig'], 60: ['sechzig'], 70: ['siebzig'], 80: ['achtzig'], 90: ['neunzig'] }; for (const [tensValue, tensWords] of Object.entries(GERMAN_TENS)) { const tens = Number(tensValue); for (let one = 1; one <= 9; one += 1) { for (const oneWord of GERMAN_ONES[one]) { for (const tenWord of tensWords) { GERMAN_NUMBER_WORDS.set(`${oneWord}und${tenWord}`, String(tens + one)); } } } } function stripGermanNumberSeparators(value) { return String(value || '') .replace(/[\s.-]+/g, ''); } export function canonicalizeNumberAnswer(value) { const raw = String(value || '').trim().toLowerCase(); if (!raw) return ''; const compact = stripGermanNumberSeparators(raw); if (/^\d+$/.test(compact)) { return String(Number(compact)); } return GERMAN_NUMBER_WORDS.get(compact) || ''; } export function normalizeComparableWithNumberWords(value, baseNormalizer) { const rawCanonical = canonicalizeNumberAnswer(value); if (rawCanonical) return rawCanonical; const normalized = baseNormalizer(String(value || '')); const normalizedCanonical = canonicalizeNumberAnswer(normalized); return normalizedCanonical || normalized; }