AutoFeedback API

Result 8ae05715-0715-4dd1-bd9b-76ba20059414

{
  "llm" : {
    "feedback" : "# Exercise: parking\n\n### Correctness\n- Die Ausgabe im Beispiel entspricht nicht der Aufgabenanforderung: gefordert ist beim Ausführen ein Gesamtumsatz von **156.75 CHF** (und sinngemäss genau diese Zahl), bei dir wird aber `\"Total Revenue: ...\"` ausgegeben und der Betrag wird mit deiner Logik sehr wahrscheinlich **nicht** 156.75 ergeben.\n\n### Suggestion\n- Vergleiche, wie sich der geforderte Gesamtumsatz 156.75 aus den im Example ausgeführten Parkvorgängen zusammensetzen müsste: rechne die drei Karten (Individual, Group(15), FlatRate) mit ihren Tarifen durch und prüfe dann, welche deiner Kostenregeln dazu nicht passt (insbesondere bei der Flatrate: wann genau soll sie verrechnet werden, und ist sie wirklich abhängig davon, ob die Karte “benutzt” wurde?).\n\n### Code Style\n- In `FlatRateCard` ist `used` als Zustandsflag etwas missverständlich, weil es nicht klar ausdrückt, *was* “used” bedeutet (einmal geparkt? in diesem Monat aktiv?). Ein präziserer Name würde die Logik leichter verständlich machen.\n\n\n# Exercise: labyrinth\n\n### Correctness\n- `Path` speichert die übergebenen Werte nicht korrekt: Im Konstruktor weist du die Parameter den Feldern „verkehrt herum“ zu, dadurch bleiben `row/col/method` in jedem `Path` auf ihren Default-Werten (0/0/null).\n- In `BacktrackingAlgorithm.find(...)` vergleichst du Strings mit `==` statt inhaltlich; damit kann die Erkennung bereits besuchter Wege fehlschlagen.\n- `BacktrackingAlgorithm` macht bei `pathToTheLeft()`/`pathToTheRight()` nur einen Turn, aber keinen Schritt; das entspricht nicht einem echten „Abbiegen und den Gang betreten“ und kann zu Endlosschleifen führen.\n- Dein `BacktrackingAlgorithm` implementiert kein echtes Backtracking (kein „zurückgehen“ entlang der zuvor gegangenen Schritte), sondern nur ein Umdrehen; damit ist nicht garantiert, dass er die letzten Levels löst.\n\n### Suggestion\n- Schau dir im `Path`-Konstruktor an, welche Seite Feld und welche Seite Parameter ist; überprüfe danach mit einem kleinen Test/Debug-Ausgabe, ob wirklich die aktuellen `row/col/method` im Objekt landen.\n- Wenn du in `find` Strings vergleichen willst, überlege dir, wie man in Java den *Inhalt* von Strings vergleicht (Stichwort: Methode statt Operator).\n- Überlege dir für Links/Rechts-Fälle: Nach dem Drehen muss die Figur typischerweise auch in den neuen Gang hineinlaufen, sonst ändert sich ihre Position nicht und du prüfst in der nächsten Iteration dieselbe Kreuzung erneut.\n- Für „Backtracking“ brauchst du eine Information, wie du zur letzten Kreuzung zurückkommst, wenn du in einer Sackgasse landest (z.B. eine Art Stack/Verlauf der Entscheidungen oder Position+Richtung). Überlege dir, was du beim Vorwärtsgehen speichern musst, um später deterministisch „einen Schritt zurück“ zu können, statt nur 180° zu drehen.\n\n### Code Style\n- In `BacktrackingAlgorithm` sind Felder wie `paths` package-private; mach sie lieber `private`, um Kapselung einzuhalten.\n- Nutze nach Möglichkeit keine String-Literale wie `\"left\"`, `\"right\"`, `\"forward\"` als Zustandsmarker; ein `enum` wäre robuster und besser lesbar.\n- `Path`-Felder sind ebenfalls package-private; auch hier besser `private` und ggf. mit Getter/Record arbeiten.\n\n\n# Exercise: swissmap\n\n### Correctness\n- `SwissMapApp`: Die `main`-Methode hat die falsche Signatur (`void main()` statt `public static void main(String[] args)`); so wird das Programm typischerweise nicht als Java-Startpunkt erkannt.\n- `City`, `Lake`, `Mountain`, `ModeButton`: Du gibst in `getInteractiveArea` jeweils ein Lambda `(px, py) -> ...` zurück. Das funktioniert nur, wenn `Shape` tatsächlich ein “funktionales Interface” mit genau einer passenden Methode ist. In der Aufgabenstellung wird aber explizit erwähnt, dass man auch die vordefinierte `Rectangle`-Klasse verwenden kann; je nach Bibliothek ist `Shape` nicht als Lambda gedacht und dein Code kompiliert dann nicht.\n\n### Suggestion\n- Schau dir an, wie Java den Einstiegspunkt findet: Welche Sichtbarkeit (`public`), welches Schlüsselwort (`static`) und welche Parameter erwartet die JVM für `main`?\n- Prüfe im GUI-Package (`ch.trick17.gui.component`), wie `Shape` genau definiert ist: Hat es nur *eine* abstrakte Methode (dann Lambda ok) oder mehrere? Falls mehrere, nimm eine vorhandene `Shape`-Implementierung (z.B. `Rectangle`) oder implementiere `Shape` als eigene Klasse mit allen benötigten Methoden.\n\n### Code Style\n- In allen drei Klassen wiederholt sich sehr viel Hover-/Tooltip-Logik (hovered-Flag, Rechteck zeichnen, `getInteractiveArea`-Berechnung). Überleg dir, ob du das über Hilfsmethoden oder eine kleine gemeinsame Basisklasse/Utility reduzieren willst (ohne die Aufgabenanforderungen zu verletzen).\n- Die Tooltip-Grössen sind “magische Zahlen” (z.B. 200, 220, 180). Als Konstanten mit sprechenden Namen wird das leichter wartbar, v.a. wenn du Textlängen/Skalierung später anpasst.\n\n\n# Exercise: visualizer\n\n### Correctness\n- Im `DataPoint`-Interface fehlen die geforderten Javadoc-Kommentare zur Dokumentation des erwarteten Verhaltens der Methoden.\n- In `VisualizerApp` ist die `main`-Methode als `void main()` deklariert; so wird sie als Startpunkt einer Java-Applikation in der Regel nicht erkannt (es fehlt die übliche Signatur, damit das Programm wirklich startet).\n- Beim Prozessor-Datensatz hast du die logarithmische Skalierung in `Processor.y()` bereits in die Daten eingebaut; laut Aufgabenstellung soll aber eine logarithmische *y-Achse* verwendet werden (d. h. die Visualisierung/Skalierung soll log sein, nicht die Rohdaten selbst).\n\n### Suggestion\n- Ergänze bei jeder Methode im `DataPoint`-Interface kurz per Javadoc, was zurückgegeben werden soll (z. B. Bedeutung von x/y, wann `group()` `null` liefern darf, wie `description()` formatiert sein soll – die Visualizer-Logik nutzt ja `split(\"\\n\")`).\n- Prüfe die erwartete Einstiegsmethode der Umgebung/Tests: Welche `main`-Signatur wird normalerweise verlangt, damit das Programm startbar ist?\n- Überlege, wo „logarithmische y‑Achse“ am sinnvollsten umgesetzt ist: Wenn du `y()` schon logarithmierst, und später die Achse ebenfalls logarithmisch wäre, würdest du effektiv doppelt loggen. Entscheide dich für eine Stelle (Daten vs. Achse) passend zur Aufgabenformulierung.\n\n### Code Style\n- Die Wahl von sehr kurzen Methodennamen `x()`, `y()` ist ok, aber ohne Javadoc ist es schwer nachvollziehbar; gerade hier ist Dokumentation Teil der Schnittstelle.\n- In `Processor.formatClock()` verwendest du für GHz immer `%.1f`; die Aufgabenbeschreibung deutet eher auf „Kommazahlen“ hin (nicht zwingend genau 1 Nachkommastelle). Falls du hier präziser werden willst, achte auf konsistente Formatierung (z. B. unnötige `.0` vermeiden).\n- In `Movie.description()`/`Country.description()` sind Zahlen direkt als Rohwerte formatiert (Budget, Bevölkerung etc.). Für die Lesbarkeit könnte man später noch formatieren (Tausendertrennzeichen), ist aber nicht gefordert.\n",
    "status" : "SUCCESS"
  }
}