Algorithmische Zeitberechnung
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 // Problem: Mehrere optionale Wörter, welches wählen?
// Bei Minute 29: FAST > KURZ > BALD > Standard if(minute === 29) { if(hat_FAST) return [..., "FAST", "HALB", ...]; else if(hat_KURZ) return [..., "KURZ", "VOR", "HALB", ...]; else if(hat_BALD) return [..., "BALD", "HALB", ...]; else return [..., "VOR", "HALB", ...]; }
// Bei Minuten 27-28: BALD > FAST > KURZ // Bei Minuten 57-59: BALD > FAST > KURZ
// Bei Minuten 01-04: KURZ nur bei :01 und :02 if(minute >= 1 && minute <= 2 && hat_KURZ) { return [..., "KURZ", "NACH", ...]; // KURZ nur bei :01 und :02 } else if(minute === 3) { return [..., "NACH", ...]; // :03 immer ohne KURZ } else if(minute === 4 && hat_BALD) { return [..., "BALD", "FÜNF", "NACH", ...]; // :04 mit BALD-Sonderfall } else if(minute >= 1 && minute <= 4) { return [..., "NACH", ...]; // Fallback für :01-:04 }
// Bei Minute 09: BALD ZEHN NACH möglich if(minute === 9 && hat_BALD) { return [..., "BALD", "ZEHN", "NACH", ...]; // :09 mit BALD-Sonderfall } else if(minute >= 5 && minute <= 9) { return [..., "FÜNF", "NACH", ...]; // Fallback für :05-:09 }
// Bei Minuten 30-34: Speziallogik für "NACH HALB" if(minute === 30) { return [..., "HALB", ...]; // Exakt halb } else if(minute === 34 && hat_BALD) { return [..., "BALD", "FÜNF", "NACH", "HALB", ...]; // :34 mit BALD-Sonderfall } else if(minute >= 31 && minute <= 32 && hat_KURZ) { return [..., "KURZ", "NACH", "HALB", ...]; // KURZ nur bei :31 und :32 } else if(minute >= 31 && minute <= 34) { return [..., "NACH", "HALB", ...]; // :31-:34 immer NACH HALB (ohne KURZ bei :33-:34) }
// Weitere BALD-Sonderfälle im Stundenverlauf: if(minute === 14 && hat_BALD) { return [..., "BALD", "VIERTEL", "NACH", ...]; // :14 mit BALD-Sonderfall } if(minute === 19 && hat_BALD && hat_ZWANZIG) { return [..., "BALD", "ZWANZIG", "NACH", ...]; // :19 mit BALD-Sonderfall (benötigt ZWANZIG) } if(minute === 39 && hat_BALD) { return [..., "BALD", "ZEHN", "NACH", "HALB", ...]; // :39 mit BALD-Sonderfall } if(minute === 44 && hat_BALD && hat_DREIVIERTEL) { return [..., "BALD", "DREIVIERTEL", ...]; // :44 mit BALD-Sonderfall (benötigt DREIVIERTEL) } else if(minute === 44 && hat_BALD) { return [..., "BALD", "VIERTEL", "VOR", ...]; // :44 mit BALD-Sonderfall (Fallback) } if(minute === 49 && hat_BALD) { return [..., "BALD", "ZEHN", "VOR", ...]; // :49 mit BALD-Sonderfall } if(minute === 54 && hat_BALD) { return [..., "BALD", "FÜNF", "VOR", ...]; // :54 mit BALD-Sonderfall } if(minute === 59 && hat_BALD) { return [..., "BALD", stunde_nächste]; // :59 mit BALD-Sonderfall }
Vollständige BALD-Sonderfälle Übersicht BALD wird verwendet um anzukündigen, dass die nächste 5-Minuten-Marke "bald" erreicht wird:
Minute | Mit BALD | Ohne BALD (Fallback) | Bedingung |
:04 | BALD FÜNF NACH | NACH | Benötigt BALD |
:09 | BALD ZEHN NACH | FÜNF NACH | Benötigt BALD |
:14 | BALD VIERTEL NACH | ZEHN NACH | Benötigt BALD |
:19 | BALD ZWANZIG NACH | VIERTEL NACH | Benötigt BALD + ZWANZIG |
:34 | BALD FÜNF NACH HALB | NACH HALB | Benötigt BALD |
:39 | BALD ZEHN NACH HALB | FÜNF NACH HALB | Benötigt BALD |
:44 | BALD DREIVIERTEL oder BALD VIERTEL VOR | ZWANZIG VOR oder ZEHN NACH HALB | Benötigt BALD (+ DREIVIERTEL für 1. Variante) |
:49 | BALD ZEHN VOR | DREIVIERTEL oder VIERTEL VOR | Benötigt BALD |
:54 | BALD FÜNF VOR | ZEHN VOR | Benötigt BALD |
:59 | BALD [STUNDE] | FÜNF VOR oder FAST/KURZ VOR | Benötigt BALD |
Lernziel: Prioritäts-Queues und Conditional Branching
Informationsentropie und Nachrichtenkomplexität