AutoFeedback API

Result 6e97b7a5-fd23-44f0-883e-70ba194b935c

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes` ist `drawRec(...)` nicht implementiert, damit wird die geforderte rekursive Boxen-Form nicht gezeichnet.\n- In `Triangles` ist `drawRec(...)` nicht implementiert, damit wird die geforderte rekursive Dreiecks-Form nicht gezeichnet.\n\n### Suggestion\n- Für `Boxes.drawRec(...)`: Überlege dir einen Rekursionsabbruch (z.B. wenn `n == 0`) und zeichne dann genau **ein** Rechteck; im Rekursionsfall solltest du die Fläche in kleinere Teilquadrate zerlegen und für diese mit `n-1` weiterzeichnen.\n- Für `Triangles.drawRec(...)`: Baue ebenfalls einen klaren Basisfall (z.B. `n == 0`), in dem du mit **drei** `drawLine(...)`-Aufrufen ein Dreieck zeichnest; im Rekursionsfall brauchst du die **Mittelpunkte der Seiten**, um daraus die kleineren Teil-Dreiecke zu bestimmen und rekursiv weiterzugehen.\n\n### Code Style\n- In `Boxes` und `Triangles` stehen noch `// TODO implement`-Kommentare ohne Umsetzung; sobald du fertig bist, entferne/aktualisiere diese Kommentare, damit klar ist, was bewusst offen ist und was fertig.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `pack(int i)` ist nicht implementiert, dadurch wird nie eine Kombination durchsucht und `solve()` liefert immer nur den Initialwert `0`.\n- `loadItem(int i)` und `unloadItem(int i)` sind nicht implementiert, damit kann das Programm keine Gegenstände (auch nicht mehrfach bis `maxN`) ein- und ausladen.\n- In `KnapsackN` fehlt bei `main()` die übliche Signatur mit Argumenten (`String[] args`); je nach Test-/Run-Umgebung wird deine `main`-Methode dadurch nicht als Einstiegspunkt erkannt.\n\n### Suggestion\n- Überlege dir für `pack(i)` die Rekursion/Iteration: Für jeden Gegenstand `i` musst du nicht nur „nicht nehmen/nehmen“, sondern „0 bis maxN mal nehmen“ durchprobieren und jeweils mit `i+1` weitermachen.\n- Achte bei der Abbruchbedingung darauf, dass du am Ende (wenn `i` alle Items durchlaufen hat) den aktuellen Wert nur dann als Kandidaten nimmst, wenn das Gewicht innerhalb `maxWeight` liegt, und dann `maxValue` aktualisierst.\n- `loadItem` sollte den aktuellen Zustand (`currWeight`, `currValue`) beim Einladen genau um das Item `i` verändern; `unloadItem` muss den Zustand wieder korrekt zurücksetzen, passend dazu wie oft du in der aktuellen Verzweigung geladen hast.\n- Für `main`: Schau dir an, wie Java Programme typischerweise gestartet werden, und passe die Signatur an, damit Tests/Runner deine Klasse ausführen können.\n\n### Code Style\n- Die TODO-Methoden sind leer; entweder implementieren oder (wenn du anders vorgehst) die unbenutzten Methoden entfernen, damit die Klasse klarer bleibt.\n- Benennungen sind gemischt (`loadItem/unloadItem` vs. in der Aufgabenidee eher `pack/unpack`); konsistente Begriffe helfen, die Rekursionslogik besser zu lesen.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, damit wird keine Lösung gesucht/platziert.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl Lösungen nicht gezählt.\n- In `Queens.java` ist `main()` nicht als Java-Entry-Point definiert (es fehlt `static void main(String[] args)`), dadurch startet das Programm so nicht wie erwartet.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise (oder spaltenweise) arbeitet: in einer Zeile alle Spalten ausprobieren, nur bei gültiger Platzierung weitermachen, und bei Fehlschlag die Dame wieder entfernen (undo) und weiterprobieren.\n- Für `count()`: Nutze denselben Backtracking-Ansatz wie bei `solve()`, aber statt beim ersten Fund abzubrechen, zählst du jede vollständige Platzierung mit und lässt die Suche weiterlaufen (wieder mit korrekt gesetztem Undo).\n- Für `main()`: Prüfe die exakte Methodensignatur, die Java zum Starten erwartet, und passe sie an, damit dein Solver überhaupt ausgeführt wird.\n\n### Code Style\n- In `QueensSolver` stehen noch die `// TODO implement`-Platzhalter; sobald du implementierst, entferne/ersetze diese Kommentare durch passendere (oder lass sie weg).\n- `getBoard()` gibt das interne Array direkt zurück; das ist zwar nicht verboten, aber macht die Klasse von außen veränderbar (ggf. später überlegen, ob du das wirklich willst).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl` sind `solved(...)` und `nofSolutions(...)` (inkl. der privaten rekursiven Varianten) nicht implementiert und liefern aktuell immer `false` bzw. `0`; damit wird das Sudoku nie gelöst und die Anzahl Lösungen nie korrekt gezählt.\n- Die `main`-Methode in `Sudoku.java` hat nicht die benötigte Signatur `public static void main(String[] args)`; so lässt sich das Programm typischerweise nicht starten.\n\n### Suggestion\n- Für `solved`: Überlege dir einen Backtracking-Schritt, der (1) das nächste Feld auswählt, (2) bei bereits belegten Feldern direkt zum nächsten weitergeht, (3) für ein leeres Feld alle Kandidaten ausprobiert und nach jedem Setzen mit `checker.oneOK(model, i, j)` (oder einer passenden Prüfung) testet, und (4) bei Fehlschlag das Feld wieder leert und den nächsten Kandidaten probiert.\n- Achte bei `solved` auch auf den Abbruchfall: Wann ist das Sudoku “fertig” (z.B. wenn `fieldNr` über alle Felder hinaus ist), und was gibst du dann zurück?\n- Für `nofSolutions`: Nutze eine sehr ähnliche Rekursion wie beim Lösen, aber statt beim ersten Fund abzubrechen erhöhst du einen Zähler für jede gefundene vollständige Lösung; stoppe die Suche, sobald `MAX` erreicht ist, und stelle sicher, dass du nach dem Durchprobieren wieder auf den ursprünglichen Zustand zurücksetzt (Backtracking).\n- Für die Startbarkeit: Vergleiche deine `main`-Signatur mit der in typischen Java-Programmen (und dem GUI-Aufruf in der Vorlage), damit die JVM den Einstiegspunkt findet.\n\n### Code Style\n- In `SudokuSolverImpl` stehen noch `// TODO implement`-Platzhalter; wenn du fertig bist, entferne sie oder ersetze sie durch kurze, erklärende Kommentare zum Backtracking-Schritt.\n",
    "status" : "SUCCESS"
  },
  "unitTest" : {
    "tests" : [ {
      "name" : "allZero()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "uselessStuff()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "random1()",
      "status" : "FAILED",
      "message" : "expected: <190> but was: <0>"
    }, {
      "name" : "random2()",
      "status" : "FAILED",
      "message" : "expected: <340> but was: <0>"
    }, {
      "name" : "random3()",
      "status" : "FAILED",
      "message" : "expected: <558> but was: <0>"
    }, {
      "name" : "example()",
      "status" : "PASSED",
      "message" : null
    } ]
  }
}