{
"llm" : {
"feedback" : "# Exercise: parking\n\n### Correctness\n- In `FlatRateCard` wird zwar immer `150` zurückgegeben, aber du sammelst trotzdem Parkzeit (`totalTime`) und setzt sie zurück; ein Abo hat laut Aufgabenstellung fixe Monatskosten, d. h. die Parkzeit sollte für die Kostenberechnung keine Rolle spielen und auch nicht zwingend verwaltet werden.\n- In `GroupCard` erlaubst du `person == 0` (weil du nur `< 0` verbietest). Die Tabelle startet bei „bis 5“ Personen – üblicherweise ist eine Gruppe mit 0 Personen nicht sinnvoll und könnte als „nicht erlaubt“ interpretiert werden.\n\n### Suggestion\n- Überlege bei `FlatRateCard`, welche Zustände die Karte wirklich braucht, wenn die Kosten komplett unabhängig vom Parken sind. Prüfe auch, wie sich das auf `park(...)` und `reset()` auswirken sollte.\n- Schau dir die Validierung im `GroupCard`-Konstruktor nochmals an und entscheide, welche Minimalzahl an Personen erlaubt sein soll, damit sie zur Tarif-Tabelle passt.\n\n### Code Style\n- In `FlatRateCard` ist `totalTime` aktuell ungenutzt für die eigentliche Logik (die Kosten hängen nicht davon ab). Das macht die Klasse unnötig kompliziert; reduziere auf das, was du wirklich brauchst.\n- Es fehlen teils `@Override`-Annotationen (z. B. in `GroupCard` und `IndividualCard`). Das hilft, Implementationsfehler früh zu erkennen.\n\n\n# Exercise: labyrinth\n\n### Correctness\n- In `TryStraightFirst` prüfst du innerhalb des äusseren Loops mit einer inneren `while (figure.pathAhead())` und läufst damit mehrere Schritte “am Stück”; die Aufgabenbeschreibung sagt jedoch “in jedem Schleifendurchlauf” genau einmal prüfen/entscheiden und dann entsprechend genau einen Schritt gehen bzw. drehen.\n- Dein `BacktrackingAlgorithm` kann in eine Situation kommen, in der `path` leer ist, du aber trotzdem in den `else`-Fall kommst (z.B. Start in einer Sackgasse oder sobald du wieder am Start bist und alles besucht wurde). Dann führt `path.get(path.size() - 1)` zu einem Crash.\n- In `BacktrackingAlgorithm` speicherst du bei einem Vorwärtsschritt `path.add(figure.dir())` **nachdem** du bereits `moveForward()` gemacht hast; dadurch passt der gespeicherte Wert nicht zwingend zu der Richtung/Entscheidung, die dich in die neue Zelle geführt hat (insbesondere wenn du später daraus eine Rückrichtung ableitest).\n- In `BacktrackingAlgorithm` drehst du bei “links” oder “rechts” nur, bewegst dich aber im selben Schleifendurchlauf nicht in die neue Richtung. Das ist nicht per se verboten, kann aber dazu führen, dass dein “Backtracking”-Stack (`path`) nicht konsistent mit den tatsächlich gelaufenen Schritten bleibt (weil du nur beim Vorwärtsgehen pushst, beim Drehen aber nichts “verbindlich” entscheidest).\n\n### Suggestion\n- Für `TryStraightFirst`: Überlege dir, wie du die Logik so umbaust, dass pro Iteration genau **eine** Aktion passiert (entweder `moveForward()` oder ein Turn), und trotzdem “geradeaus bevorzugt” bleibt.\n- Für den leeren `path`-Fall im Backtracking: Denk an eine Abbruchbedingung oder einen speziellen Fall, wenn du zurückgehen willst, aber nichts mehr zum Zurückgehen gespeichert ist.\n- Für das Speichern der Richtung im Backtracking: Speichere nicht irgendeinen aktuellen `dir()`-Wert “irgendwann”, sondern genau die Information, die du später fürs Rückwärtsgehen wirklich brauchst (z.B. die Richtung, in die du den Schritt gemacht hast, oder alternativ die Positionen). Achte darauf, **wann** du sie erfasst (vor/nach Drehung bzw. vor/nach `moveForward()`).\n- Für die Konsistenz zwischen Drehen und Stack: Prüfe, ob dein Stack wirklich “Schritte” repräsentieren soll (dann nur bei tatsächlichem `moveForward()` ändern) und ob deine Rückdreh-Logik dann auch genau zu diesen gespeicherten Schritten passt.\n\n### Code Style\n- Tippfehler im Methodennamen `nexCellVisited` → besser korrekt benennen (`next...`) für Lesbarkeit.\n- Statt `row + \",\" + col` als Schlüssel wäre ein kleines Hilfsobjekt (oder `row * factor + col`) lesbarer/robuster; Strings als Koordinaten-Key funktionieren, sind aber unnötig fehleranfällig.\n- In `BacktrackingAlgorithm` wäre ein `Deque`/Stack-Typ semantisch passender als `ArrayList`, weil du ausschliesslich am Ende push/pop machst.\n\n\n# Exercise: swissmap\n\n### Correctness\n- In `SwissMapApp` ist deine `main`-Methode nicht als Java-Entry-Point deklariert (`public static void main(String[] args)`); so startet das Programm je nach Umgebung nicht wie gefordert über `main`.\n- Der Button heisst in der Aufgabe explizit `ModeButton`, bei dir ist die Klasse `Button`; damit erfüllst du die Vorgabe “neue Klasse `ModeButton`” nicht.\n- In `City`, `Lake`, `Mountain` sowie `Button` togglest du den Hover-Zustand mit `isHovered = !isHovered` sowohl bei `onMouseEnter` als auch bei `onMouseExit`; damit kann der Zustand nach mehreren Enter/Exit-Ereignissen “falsch” werden (z.B. wenn Events doppelt feuern), und die Anzeige der Beschreibung ist dann nicht zuverlässig.\n- In `Button` setzt du zwar `isHovered`, aber du verwendest es im `draw` nirgends; damit reagiert der Button visuell nicht auf Hover (die Aufgabe verlangt zwar nicht zwingend eine optische Änderung, aber dein Hover-Handling hat so aktuell keinen Effekt).\n\n### Suggestion\n- Schau dir die genaue Signatur an, die Java als Startpunkt erwartet, und passe deine `main` entsprechend an.\n- Benenne die Button-Klasse so, wie sie in der Aufgabenstellung verlangt wird, und aktualisiere die Verwendung in `SwissMapApp`.\n- Setze den Hover-Status in `onMouseEnter` und `onMouseExit` deterministisch (Enter → “hovered an”, Exit → “hovered aus”), statt ihn jeweils zu invertieren; dann bleibt die Beschreibung stabil ein-/ausblendbar.\n- Wenn du im Button schon Hover-Logik implementierst, nutze den Hover-Zustand auch im `draw`, oder lass `Hoverable` weg, falls du ihn nicht brauchst.\n\n### Code Style\n- `javax.imageio.ImageIO`, `BufferedImage`, `Objects` und das manuelle Laden der PNGs in `Lake`/`Mountain` sind hier unnötig kompliziert, weil du die Bilder bereits direkt per `gui.drawImage…(\"swissmap/…\")` zeichnest; das zusätzliche Laden dient bei dir nur dazu, Breite/Höhe zu bekommen und macht den Code schwerer.\n- Klassen-/Dateinamen: `Button` ist sehr generisch und kollidiert gedanklich leicht mit GUI-Buttons; ein sprechender Name (und gemäss Aufgabe) wäre klarer.\n- In `Button` ist das Feld `isHovered` aktuell ungenutzt (wird gesetzt, aber nie gelesen).\n\n\n# Exercise: visualizer\n\n### Correctness\n- In `DataPoint`/Implementierungen ist die Methode als `getDesciption()` benannt (Tippfehler). Falls in der Aufgabenstellung bzw. im erwarteten Interface die Methode korrekt `getDescription()` heissen soll, passt deine Signatur nicht zur Erwartung und führt dazu, dass Code, der die korrekte Methode aufruft, nicht kompiliert.\n- Beim Processor-Datensatz soll die **effektive Rechengeschwindigkeit** als *clock rate × cores* verwendet werden und **der Visualizer soll eine logarithmische y-Achse verwenden**. Du nimmst stattdessen bereits in `Processor.getY()` den Logarithmus (`Math.log10(...)`). Damit ist die Achse im Visualizer nicht wirklich „logarithmisch“, sondern du lieferst nur geloggte Werte; das entspricht nicht der geforderten Trennung (Datenwert vs. Achsenskalierung).\n- `Movie.getX()` gibt das Budget „in Millionen“ zurück. In der Aufgabenbeschreibung steht für die x‑Achse explizit „Filmbudget“ (ohne Umrechnung). Wenn die Visualisierung/Skalierung und Detailanzeige das Budget wie im Datensatz erwartet, kann diese Umrechnung vom geforderten Verhalten abweichen.\n\n### Suggestion\n- Prüfe die exakte Methodensignatur, die dein Interface anbieten soll (insbesondere die Schreibweise von „Description“). Such nach allen Stellen, wo der Visualizer den Detailtext aufruft, und stelle sicher, dass Interface und Implementierungen exakt gleich heissen.\n- Überlege dir beim Prozessor-Datensatz, wo „logarithmische y‑Achse“ hingehört: Entweder ist es eine Einstellung/Transformation im Visualizer (Skalierung) oder ein Rohwert im DataPoint. Entscheide dich für **eine** Stelle und liefere an der anderen Stelle dann den „echten“ Geschwindigkeitswert (ohne Log), damit Anforderung und Darstellung konsistent sind.\n- Falls „Budget“ als Rohwert gemeint ist: Lass `getX()` direkt den Budget-Wert liefern und mache eine Umrechnung (z.B. in Millionen) höchstens in der Textdarstellung für den Hover, nicht als Datenkoordinate.\n\n### Code Style\n- Benenne `getbudgetInMillions()` nach Java-Konvention `getBudgetInMillions()` (CamelCase) und konsistent zu deinen anderen Getter-Namen.\n- Strings in `getDesciption()` sind teils schwer lesbar (z.B. `\"GDP/capitas\"` / Einheiten). Überlege dir einheitliche Labels/Einheiten und formatiere Zahlen ggf. (z.B. begrenzte Dezimalstellen) für die Anzeige.\n- In `Processor.getClockRateKhzFormated()` ist „Formated“ ebenfalls ein Tippfehler („Formatted“) und die Methode ist eigentlich keine Getter-typische Rückgabe eines Feldes; ein Name wie `formatClockRate()` wäre klarer.\n",
"status" : "SUCCESS"
}
}