{
"llm" : {
"feedback" : "# Exercise: parking\n\n### Correctness\n- In `GroupCard` ist der Fall „mehr als 20 Personen“ nicht abgedeckt: Laut Aufgabe ist das **nicht erlaubt**, bei dir wird aber einfach zum 2.00 CHF/h-Tarif weitergerechnet.\n- In `GroupCard` ist die Tarifstaffel „11–20 Personen = 2.00 CHF/h“ nicht korrekt umgesetzt: Deine Bedingung `persons >= 11` schließt auch Werte > 20 ein, obwohl diese verboten sind.\n\n### Suggestion\n- Überlege dir, wo du die Regel „> 20 nicht erlaubt“ am sinnvollsten durchsetzt: entweder schon im Konstruktor (beim Erzeugen der Karte) oder spätestens in `cost()` (z.B. durch eine Exception oder eine andere klare Reaktion).\n- Formuliere die Bedingungen für die Tarifbereiche so, dass die Bereiche sich exakt an die Tabelle halten (bis 5, 6–10, 11–20) und kein „Restbereich“ versehentlich mit abgedeckt wird.\n\n### Code Style\n- In `GroupCard` ist `HOURLY_RATE` deklariert, wird aber nie verwendet – entweder entfernen oder wirklich verwenden.\n- In `FlatRateCard` wird `totalTime` gespeichert und in `park/reset` verändert, obwohl `cost()` immer konstant ist; das ist unnötiger Zustand und macht die Klasse verwirrender als nötig.\n- In `GroupCard` ist `persons` package-private (kein `private`); kapsle Felder normalerweise als `private` und biete nur das Nötige nach außen an.\n\n\n# Exercise: labyrinth\n\n### Correctness\n- `TryStraightFirst` erfüllt die geforderte Entscheidungsreihenfolge nicht: Wenn vorne frei ist, ok; wenn nicht, soll links **oder** rechts versucht werden und wenn beides nicht geht, rechtsum kehrt. Dein Code versucht effektiv erst rechts, und wenn das nicht geht, drehst du nur nach links (insgesamt 90° links von der Ausgangsrichtung), aber machst weder einen Linkstest mit Move noch sicher eine Kehrtwende.\n- `TryStraightFirst` macht keine Prüfung/Behandlung für den Fall, dass nach dem “links drehen” ebenfalls kein Pfad existiert; dadurch kann die Figur in der nächsten Schleifeniteration weiterhin vor eine Wand schauen und in einer Drehschleife hängen bleiben statt wie gefordert umzudrehen.\n- In `BacktrackingAlgorithm` benutzt du `dirOffsets.get(dir)` und rechnest damit `nextRow/nextCol` aus, aber `dir` ist von der aktuellen Blickrichtung abhängig (du drehst im Loop ständig). Dadurch kann das Offset für eine Richtung zwar stimmen, aber es setzt voraus, dass deine “Richtung-zu-Offset”-Zuordnung stabil und korrekt ermittelt wurde; dein “probeweiser Schritt” verändert jedoch kurzzeitig die Position/Orientierung und ist fehleranfällig, wenn in genau dieser Situation Backtracking/Visited-Logik greift.\n- In `BacktrackingAlgorithm` markierst du Positionen global als `visited` und entfernst sie beim Backtracking nie. Das kann verhindern, dass du eine Zelle später über einen anderen Weg erneut betrittst, obwohl das für korrektes Backtracking in manchen Labyrinthen nötig ist (typisch: “visited” eher für den aktuellen Pfad/Stack oder mit zusätzlicher Zustandsinfo wie Richtung).\n\n### Suggestion\n- Für `TryStraightFirst`: Überlege dir eine klare Reihenfolge innerhalb eines Schleifendurchlaufs: “vorne”, sonst “links”, sonst “rechts”, sonst “umdrehen”. Wichtig ist: Bei jedem Versuch solltest du erst prüfen, ob dort ein Pfad ist, **dann** drehen und laufen (oder drehen, prüfen, laufen), und bei Misserfolg wieder in einen definierten Zustand kommen, bevor du den nächsten Versuch machst.\n- Für den “umdrehen”-Fall in `TryStraightFirst`: Eine Kehrtwende bedeutet 180° Drehung und dann ein Schritt (oder zumindest so ausrichten, dass du im nächsten Loop sicher wegkommst). Prüfe, ob du nach deinem aktuellen Else-Zweig wirklich 180° von der Ausgangsrichtung weg zeigst.\n- Für `BacktrackingAlgorithm`: Statt Offsets “herauszumessen” kannst du den nächsten Schritt rein über die vorhandenen Sensoren (`pathAhead`, `pathToTheLeft`, `pathToTheRight`) und gezielte Drehungen steuern. Dann brauchst du keine Koordinaten-Vorhersage und auch keine `dirOffsets`-Map.\n- Für `visited` im Backtracking: Überlege, ob du “besuchte Zellen” global sperren willst (Graph-Suche) oder ob du “Zellen im aktuellen Rekursionspfad” markieren willst (klassisches Backtracking). Wenn du global sperrst, brauchst du meist zusätzliche Information (z.B. von welcher Seite du kamst / in welchem Zustand), sonst kann es zu “zu früh ausgeschlossen” kommen.\n\n### Code Style\n- In `BacktrackingAlgorithm` ist `dirOffsets` als `private final java.util.Map...` deklariert, während du oben schon `import java.util.Set; import java.util.HashSet;` nutzt. Einheitlicher Import-Stil (entweder immer importieren oder immer vollqualifizieren) macht den Code lesbarer.\n- `dirOffsets` wird als Feld gehalten und damit zwischen Läufen/Levels wiederverwendet. Selbst wenn das funktioniert, ist das überraschend: Entweder beim Start von `navigate` initialisieren/zurücksetzen oder klar kommentieren, warum es bewusst persistent ist.\n- Die Positionskodierung als `row + \",\" + col` funktioniert, ist aber unnötig fehleranfällig/ineffizient. Lesbarer wäre eine kleine Hilfsstruktur/Record oder ein eindeutiger Integer-Key (ohne String-Bastelei).\n\n\n# Exercise: swissmap\n\n### Correctness\n- In `SwissMapApp` ist die `main`-Methode nicht als Java-Entry-Point deklariert (sie ist weder `public` noch `static` und hat keinen `String[] args`-Parameter); so startet das Programm typischerweise nicht über „Run“.\n- In `SwissMapApp` verwendest du `gui.addComponents(...)`; je nach gegebener `Gui`-API existiert diese Methode evtl. nicht (im Auftrag wird explizit `gui.addComponent(...)` erwähnt).\n- In `ModeButton.draw` ist der Text „Sattelite View“ geschrieben; falls im Auftrag ein klarer „Satelliten-Modus“/korrekte Beschriftung erwartet wird, ist das zumindest inkonsistent (Rechtschreibung/Bezeichnung).\n\n### Suggestion\n- Schau dir an, welche Signatur die Java-Startmethode haben muss, damit deine App wirklich als Programm-Einstieg erkannt wird, und passe `main` entsprechend an.\n- Prüfe im `Gui`-Javadoc/Autocomplete, ob es eine Methode gibt, um mehrere Komponenten auf einmal hinzuzufügen. Falls nicht: überlege, wie du die Arrays trotzdem sauber einzeln registrierst (z. B. Schleife).\n- Wenn die Button-Beschriftung Teil der Aufgabe/Abgabe ist: orientiere dich an der geforderten Bezeichnung („Satelliten-Modus“) und überprüfe die Schreibweise.\n\n### Code Style\n- Verwende konsistente Bezeichner: `SwissMap Karte` ist ungewohnt gemischt (Deutsch + Großbuchstabe für Variable). Nimm lieber einen klein geschriebenen, sprechenden Variablennamen.\n- In `ModeButton` sind `onMouseEnter`/`onMouseExit` leer, obwohl du `Hoverable` implementierst; entweder Hover-Effekt (z. B. Highlight) umsetzen oder das Interface weglassen, falls nicht gebraucht.\n- Du importierst in mehreren Klassen `Shape`, verwendest aber dann trotzdem den vollqualifizierten Namen `new ch.trick17.gui.component.Rectangle(...)`; entscheide dich für eine Variante (Import + `new Rectangle(...)` ist lesbarer).\n\n\n# Exercise: visualizer\n\nLlm Evaluation ist für diese Aufgabe deaktiviert. Entferne die .llmignore Datei vom Package der Aufgabe.\n",
"status" : "SUCCESS"
}
}