Algorithmische Zeitberechnung
**Problem:** 24-Stunden-Format in 12-Stunden konvertieren
Modulo-Arithmetik für 12-Stunden-Format
Problem: 24-Stunden-Format in 12-Stunden konvertieren
let h12 = stunden % 12;
if(h12 === 0) h12 = 12; // Spezialfall: 0 → 12 und 12 → 12
// Beispiele:
// 00:xx → 0 % 12 = 0 → 12 (ZWÖLF)
// 13:xx → 13 % 12 = 1 → 1 (EINS)
// 23:xx → 23 % 12 = 11 → 11 (ELF)
Lernziel: Modulo-Operator für zyklische Bereiche
Kontext-abhängige Stundenwahl
Problem: "HALB ZWEI" bei 13:30, nicht "HALB EINS"
let anzeigeStunde = h12;
if(minuten >= 20) {
anzeigeStunde = (h12 % 12) + 1;
}
// Beispiele:
// 13:15 → h12=1, min<20 → "VIERTEL NACH EINS"
// 13:30 → h12=1, min>=20 → "HALB ZWEI" (anzeigeStunde=2)
Lernziel: Kontext-sensitive Datenverarbeitung
Alternative Einleitung: WIR HABEN statt ES IST
Problem: Layout-abhängige Wortwahl für die Einleitung Regel: Wenn WIR und HABEN im Grid vorhanden sind, verwende diese statt ES IST
const gridStr = getGridString();
const hasWir = gridStr.includes("WIR");
const hasHaben = gridStr.includes("HABEN");
const useAlternative = hasWir && hasHaben;
let words = useAlternative ? ["WIR", "HABEN"] : ["ES", "IST"];
// Beispiele:
// Grid enthält "WIR" und "HABEN" → 13:00 → "WIR HABEN EINS UHR"
// Grid enthält "ES" und "IST" → 13:00 → "ES IST EIN UHR"
// Grid enthält "WIR", "HABEN", "NACHT" → 00:00 → "WIR HABEN NACHT"
Lernziel: Layout-gesteuerte Sprachvarianten und bedingte Initialisierung
Kontext-abhängige EIN/EINS-Konvertierung
Problem: "EIN UHR" vs. "EINS" bei 1:00 Regel: "EINS" → "EIN" nur wenn "UHR" als letztes Wort im Pattern vorhanden ist
// Prüfen ob UHR im Grid vorhanden ist und als letztes Wort steht
const uhrPos = gridStr.lastIndexOf("UHR");
const hasUhrAtEnd = uhrPos !== -1 && gridStr.substring(uhrPos + 3).replace(/[_\s]/g, '').length === 0;
if(minuten === 0) {
// Volle Stunde
if(hasUhrAtEnd) {
// UHR ist vorhanden und am Ende: "ES IST EIN UHR"
if(hourWord === "EINS") hourWord = "EIN";
words.push(hourWord, "UHR");
} else {
// UHR fehlt oder ist nicht am Ende: "ES IST EINS"
words.push(hourWord); // bleibt "EINS", kein "UHR"
}
}
// Beispiele:
// Pattern: "...EIN...UHR___" → 01:00 → "ES IST EIN UHR"
// Pattern: "...EINS...NACHT" → 01:00 → "ES IST EINS" (ohne UHR)
Lernziel: Layout-abhängige Textanpassung und String-Manipulation
Bereichs-Mapping mit If-Else-Kaskade
if(minuten === 0) {
return ["ES", "IST", stunde, "UHR"];
}
else if(minuten >= 1 && minuten <= 4) {
return ["ES", "IST", "NACH", stunde];
}
else if(minuten >= 5 && minuten <= 9) {
return ["ES", "IST", "FÜNF", "NACH", stunde];
}
// ... weitere Bereiche
Lernziel: Range-Checks und Intervall-Logik
Prioritäts-basierte Selektion und Fallback-Logik
CharGraph unterstützt optionale Modifikatoren wie FAST, KURZ und BALD, die eine genauere Zeitangabe ermöglichen.
Grundkonzept
Bei mehreren verfügbaren Modifikatoren muss das System entscheiden, welcher verwendet wird. Diese Entscheidung basiert auf:
- Gültigkeitsbereichen: Nicht jeder Modifikator darf bei jeder Minute verwendet werden
- Prioritäten: Wenn mehrere Modifikatoren gültig sind, bestimmt eine Prioritätsliste die Auswahl
Beispiel
// :29 - Drei Modifikatoren sind im Pattern vorhanden
if(minute === 29) {
// Welcher wird verwendet?
// → Siehe Kapitel 19: Fallback-Logik und Prioritätsmodifikatoren
}
Detaillierte Spezifikation
Für die vollständige Dokumentation der Gültigkeitsbereiche, Prioritäten und Algorithmen siehe:
→ Kapitel 19: Fallback-Logik und Prioritätsmodifikatoren
Dort finden Sie:
- Genaue Gültigkeitsbereiche für jeden Modifikator
- Prioritätsmatrizen für jede Minute
- Code-Implementierungen in Python und TypeScript
- 1.940 automatisierte Tests zur Verifizierung
Lernziel: Verstehen, dass komplexe Logik modular ausgelagert werden kann (DRY-Prinzip, Single Source of Truth)