{
"llm" : {
"feedback" : "# Exercise: parking\n\n### Correctness\n- In `FlatRateCard` wird in `cost()` immer 150 zurückgegeben, unabhängig davon, ob überhaupt geparkt wurde; dadurch wird eine Flatrate-Karte auch ohne Nutzung immer als Umsatz gezählt, was den geforderten Gesamtumsatz (156.75 CHF) verfälscht.\n\n### Suggestion\n- Überlege dir, wann eine `FlatRateCard` die Monatskosten tatsächlich “verrechnen” soll: beim bloßen Registrieren oder erst wenn sie im Abrechnungszeitraum genutzt wurde. Nutze dafür den vorhandenen internen Zustand (z.B. ob je geparkt wurde / wie viel Zeit) und passe `cost()` so an, dass sie nur in diesem Fall 150 CHF beiträgt.\n\n### Code Style\n- `FlatRateCard` und `GroupCard` duplizieren fast identische Logik (`totalTime`, `park`, `reset`); das schreit nach gemeinsamer Wiederverwendung (z.B. über eine abstrakte Basisklasse oder eine kleine gemeinsame Hilfsklasse), damit du weniger Copy-Paste hast.\n- In `ParkingSystem.java` ist `import javax.smartcardio.Card;` unbenutzt und sollte entfernt werden.\n- In `GroupCard` sollte `HOURLY_RATE` als Konstante/Instanzfeld sauber modelliert werden (z.B. `private final double hourlyRate;` statt ein veränderbares Feld mit Großbuchstaben, was wie eine Konstante wirkt).\n\n\n# Exercise: labyrinth\n\n### Correctness\n- In `LabyrinthApp` startest du die Levels erst ab `level = 7`; laut Aufgabe soll der Algorithmus grundsätzlich für alle Levels laufen (und du sollst die vorherigen Algorithmen jeweils in der `main` ersetzen, nicht Levels “überspringen”).\n- Dein `BacktrackingAlgorithm` ist nicht allgemein: du setzt `direction = 2` mit Kommentar “Anpassen je nach Level” – das widerspricht der Anforderung, dass der Algorithmus allgemein für alle Labyrinthe funktioniert.\n- In `BacktrackingAlgorithm` nutzt du keine “visited”-Logik / Markierung für bereits besuchte Zustände; dadurch kann der Algorithmus in Labyrinthen mit Zyklen potentiell endlos laufen und ist damit nicht zuverlässig für “alle diese Labyrinthe”.\n- Die Variable `direction` wird von der Figur-Orientierung (`figure.dir()`) entkoppelt geführt und startet zudem mit einem festen Wert; damit kann deine interne Richtungslogik von der tatsächlichen Ausrichtung der Figur abweichen (und ist funktional auch nicht abgesichert).\n\n### Suggestion\n- Lass in `LabyrinthApp` alle Levels durchlaufen und wechsle nur den Algorithmus (so wie es die Aufgabe beschreibt), damit du wirklich siehst, ob dein Algorithmus überall funktioniert.\n- Vermeide “Startwerte je nach Level”: nutze stattdessen nur den Zustand, den du von `Figure` bekommst (Position/Orientierung), sodass dein Algorithmus ohne manuelle Anpassung startklar ist.\n- Überlege dir beim Backtracking, wie du verhindern kannst, dass du in Schleifen immer wieder die gleichen Kreuzungen/Positionen in gleicher Blickrichtung erneut explorierst (z.B. ein Konzept von “besuchten Zuständen”).\n- Wenn du eine interne Richtung überhaupt speicherst, dann stelle sicher, dass sie immer aus `figure.dir()` abgeleitet oder 100% konsistent mit allen `turnLeft/turnRight/turnAround`-Aufrufen ist – sonst triffst du Entscheidungen basierend auf einem falschen Modell.\n\n### Code Style\n- `direction` ist aktuell redundant (du verwendest sie nirgends für Entscheidungen); entweder konsequent nutzen oder entfernen, sonst wirkt es wie “toter Zustand”.\n- In `BacktrackingAlgorithm` sind `moveForward/turnLeft/turnRight`-Wrapper ohne Zusatzlogik eher unnötig; entweder Mehrwert geben (z.B. Logging/State-Handling) oder direkt `figure.*` aufrufen, um es schlanker zu halten.\n- Viele Dateien (`Figure`, `Labyrinth`, `LabyrinthGame`, …) sind 1:1 aus der Vorlage kopiert; für die Abgabe reicht normalerweise, nur die eigenen Algorithmus-Klassen und die Änderung in `LabyrinthApp` zu liefern (abhängig von euren Abgabe-Regeln).\n\n\n# Exercise: swissmap\n\n### Correctness\n- `Coordinate.toGuiX(...)` und `Coordinate.toGuiY(...)` greifen auf `SwissMap.TOP_LEFT.east` bzw. `.north` zu, aber diese Felder sind in `Coordinate` `private`; so wie es jetzt ist, kompiliert das nicht.\n- `InteractiveArea` implementiert `Shape.contains(...)` immer mit `false`; falls du diese Klasse irgendwo verwenden würdest, wäre der interaktive Bereich nie “treffbar” (Hover/Click würde dann nie auslösen).\n\n### Suggestion\n- Schau dir an, wie `Coordinate`’s `east`/`north` von aussen zugreifbar sein sollen: Entweder über Getter (`getEast()/getNorth()`) oder indem du die Rechnung so umbaust, dass du nicht direkt auf die Felder zugreifen musst.\n- Wenn du eine eigene `Shape`-Klasse behalten willst, muss `contains(x,y)` sinnvoll prüfen, ob der Punkt im Bereich liegt; alternativ kannst du konsequent bei `Rectangle` bleiben und `InteractiveArea` ganz weglassen.\n\n3. Code Style:\n- `InteractiveArea` wirkt aktuell wie “toter” Code (und zudem immer-false) – entfernen, wenn du ihn nicht brauchst, oder korrekt implementieren und dann wirklich verwenden.\n- In `ModeButton` sind Imports sehr unsauber/ungenau (`import ch.trick17.gui.Gui.*;` und `import ch.trick17.gui.component.*;`) und es gibt mindestens einen unnötigen Import (`Gui.*` passt hier nicht). Besser gezielt nur die Klassen importieren, die du wirklich nutzt.\n- `ModeButton.draw(...)`: Du zeichnest/füllst Rechteck und Text mit hartcodierten Koordinaten; als Konstante(n) auslagern würde Lesbarkeit und Anpassbarkeit verbessern.\n\n\n# Exercise: visualizer\n\n### Correctness\n- Beim Prozessor-Datensatz soll die _y_-Achse die **effektive Rechengeschwindigkeit = clockRate * cores** darstellen; in deiner Implementierung von `Processor.getY()` verwendest du stattdessen `log10(...)` und teilst zusätzlich durch `1000`, wodurch nicht mehr die geforderte Größe zurückgegeben wird.\n- Die Aufgabe verlangt, dass beim Prozessor-Datensatz der Veröffentlichungsmonat als _x_-Wert genutzt wird, indem Jahr und Monat „zu einem einzigen Wert kombiniert“ werden; `year + month / 12.0` ist dafür zwar eine Kombination, bildet aber den Monat nicht als „Monatsindex“ innerhalb des Jahres ab (je nach Erwartung kann das zu einer anderen zeitlichen Einordnung führen, speziell bei `month`-Werten 1–12).\n- In `Processor.getDetails()` gibst du `clockRateKhz` als `\"Mhz\"` aus, obwohl der Wert laut Feldname in **kHz** ist; außerdem verlangt die Aufgabe eine Umrechnung in passende Einheit (kHz/MHz/GHz) inkl. Formatregeln (GHz mit Dezimalzahl, kHz/MHz als ganze Zahl).\n- Die Aufgabe weist darauf hin, dass für den Prozessor-Datensatz eine **logarithmische y-Achse** verwendet werden soll; aktuell ist im `Visualizer` keine Log-Skalierung implementiert (du hast den Logarithmus stattdessen in `getY()` eingebaut, was aber nicht dasselbe ist wie „logarithmische Achse“ im Visualizer-Kontext der Aufgabe).\n\n### Suggestion\n- Überlege dir für `Processor.getY()`: Welche Größe soll laut Text wirklich geplottet werden (vor dem Skalieren) und wo sollte dann die Logarithmierung stattfinden, wenn die Achse logarithmisch sein soll?\n- Prüfe bei der Zeitkodierung in `Processor.getX()`, ob `month` in den CSV-Daten 1–12 oder 0–11 ist und ob deine Formel den Monatsabstand korrekt und gleichmäßig abbildet (z. B. ob Januar genau „am Jahresanfang“ liegt).\n- Für `Processor.getDetails()`: Geh von der Einheit kHz aus und leite daraus systematisch ab, wann du in MHz bzw. GHz umrechnen willst; achte dann auf die geforderte Darstellung (Ganzzahlen vs. Dezimalzahl) und auf die korrekte Einheit im String.\n- Falls der Auftrag wirklich eine „logarithmische y-Achse“ meint (nicht „logarithmierte Daten“), such im `Visualizer` die Stelle, wo `guiY(...)` berechnet wird, und überlege, wie man dort (oder über eine Achsen-Strategie) eine Log-Skalierung abbilden könnte, ohne die Datensätze selbst zu verbiegen.\n\n### Code Style\n- In `Visualizer` sind `DUMMY_DOUBLE` und `DUMMY_STRING` jetzt unbenutzt; die könntest du entfernen, sobald alles ersetzt ist, um Verwirrung zu vermeiden.\n- `Movie.getX()` hat den Kommentar `// Beispiel`, der im finalen Stand eher irritiert; entweder entfernen oder durch eine aussagekräftige Begründung ersetzen.\n- In `Country.getDetails()` sind die Trennzeichen uneinheitlich (mal Komma, mal Zeilenumbruch mitten im Text); ein konsistentes Format (jede Info eigene Zeile) verbessert Lesbarkeit, besonders im Hover-Overlay.\n",
"status" : "SUCCESS"
}
}