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:

  1. Gültigkeitsbereichen: Nicht jeder Modifikator darf bei jeder Minute verwendet werden
  2. 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)