Files
yourpart3/frontend/src/utils/numberAnswerVariants.js
Torsten Schulz (local) 294a38cd2a Bisaya kurs korrekturen
2026-06-06 13:16:04 +02:00

111 lines
2.4 KiB
JavaScript

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;
}