AutoFeedback API

Result 76db4f22-ebb8-438f-ab97-852e904aeec1

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec`: Du zeichnest bei `n > 0` alle vier Teilquadrate wieder rekursiv weiter herunter. In der geforderten Box-Fraktal-Form bleibt typischerweise mindestens ein Teilquadrat „gefüllt“/direkt gezeichnet (also nicht weiter unterteilt), sonst entsteht ein anderes Muster als erwartet.\n- In `Triangles`: Die rekursive Zeichenlogik ist nicht implementiert (es wird weder im Basisfall ein Dreieck gezeichnet, noch werden kleinere Dreiecke rekursiv erzeugt).\n\n### Suggestion\n- Überlege bei `Boxes`, ob wirklich alle vier Quadranten bei jedem Schritt nochmals weiter subdividiert werden sollen. Vergleiche die Ziel-Form: Ein Teilbereich wird oft „als Block“ gezeichnet (Basisfall erzwungen), während die anderen Teilbereiche weiter in die Tiefe gehen.\n- Für `Triangles`: Starte mit einem klaren Basisfall (`n == 0`), der das Dreieck nur mit `drawLine` zeichnet. Für den rekursiven Fall: Berechne zuerst die Mittelpunkte der drei Kanten und rufe dann die Rekursion für die Teil-Dreiecke auf, die in der Zielgrafik übrig bleiben.\n\n### Code Style\n- In `Boxes.drawRec` sind die Positionsberechnungen mehrfach als Ausdruck wiederholt (`x + (s / 2)`, `y + (s / 2)`, `s / 2`). Lesbarer wird es, wenn du `half = s / 2` einmal berechnest und dann überall verwendest.\n- Die Kommentare „TODO implement“ sind in `Boxes` erledigt, aber stehen noch drin; in `Triangles` steht noch die komplette TODO-Schablone ohne Umsetzung.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `pack(int i)` ist nicht implementiert; damit wird nie eine Lösung durchsucht und `solve()` liefert immer `0` statt des optimalen Werts.\n- `loadItem(int i)` und `unloadItem(int i)` sind nicht implementiert; dadurch kann das „n-mal mitnehmen“ (maxN) nicht umgesetzt werden.\n\n### Suggestion\n- Überlege dir für `pack(i)` eine rekursive/iterative Entscheidung pro Item-Index `i`: nicht nur „mitnehmen oder nicht“, sondern „0 bis maxN-mal mitnehmen“ und danach zum nächsten Item weitergehen.\n- Achte darauf, dass du beim Erreichen des Endes (`i == weights.length`) den aktuellen Wert als Kandidat für `maxValue` prüfst, aber nur wenn `currWeight <= maxWeight`.\n- Implementiere `loadItem` so, dass es das aktuelle Gewicht und den aktuellen Wert passend zum Item erhöht; `unloadItem` muss den Zustand wieder genau zurücksetzen (sonst „vererben“ sich Zustände in andere Zweige der Suche).\n\n### Code Style\n- Die Methoden heißen in deiner Vorlage `loadItem`/`unloadItem`, im Beispiel `packItem`/`unpackItem`; entscheide dich für konsistente Namen (auch passend dazu, ob du ein Item einmal oder ggf. mehrfach lädst).\n- In `KnapsackN` hat `main()` nicht die übliche Signatur `main(String[] args)`; falls die Tests/Runner die Standard-Signatur erwarten, kann das beim Ausführen stören.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, damit wird keine Lösung gesucht/gefunden und das Board bleibt leer.\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 `static void main(String[] args)` deklariert; so wird das Programm in einer normalen Java-Umgebung nicht als Startpunkt erkannt.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Struktur, die zeilenweise vorgeht (Basisfall: „alle Zeilen erfolgreich belegt“) und in jeder Zeile alle Spalten ausprobiert, nur wenn `checkPlacement(row,col)` erlaubt ist; beim Zurückgehen musst du die gesetzte Dame wieder entfernen.\n- Für `count()`: Nutze eine ähnliche Rekursion wie bei `solve()`, aber statt beim ersten Fund abzubrechen, summierst du die Ergebnisse aller gültigen Platzierungen; der Basisfall liefert dann „1 Lösung gefunden“.\n- Für `main()`: Vergleiche die erwartete Java-Signatur für den Programmeinstieg mit deiner Methode und passe sie so an, dass sie vom JVM-Launcher erkannt wird.\n\n### Code Style\n- In `getBoard()` ist `return this.board;` zwar ok, aber im Rest der Klasse nutzt du `board` ohne `this`; bleib konsistent.\n- Die `// TODO implement`-Kommentare sind okay während der Arbeit, sollten aber entfernt werden, wenn du fertig bist (sonst wirken sie wie „unfertig abgegeben“).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, `solved(SudokuModel model, int fieldNr)` is not implemented and always returns `false`, so the Sudoku will never be solved even if a solution exists.\n- In `SudokuSolverImpl`, `nofSolutions(SudokuModel model, int fieldNr, int max)` is not implemented and always returns `0`, so solution counting will always report zero solutions.\n- In `Sudoku.java`, your `main` method is not declared as `public static void main(String[] args)`, so the application won’t start in the usual way expected by Java/most IDEs.\n\n### Suggestion\n- For `solved(...)`: Think about a recursive backtracking approach where `fieldNr` moves from 0 to `size*size - 1`, and you stop successfully once `fieldNr` reaches `size*size`. For each cell, decide differently depending on whether it’s already filled (`!= 0`) or empty (`== 0`).\n- For trying values in an empty cell: Iterate through the candidate numbers `1..model.size()`, set the value, and use `checker.oneOK(model, i, j)` to decide whether to recurse deeper; if deeper recursion fails, undo your choice (clear the cell) and try the next value.\n- For `nofSolutions(...)`: Use the same traversal/backtracking as in `solved`, but instead of returning a boolean, accumulate a count. When you reach the “all fields processed” base case, that should contribute exactly one solution to the count.\n- For respecting the `max` limit: When accumulating counts from deeper recursion, reduce the remaining allowed solutions (e.g., “how many more can I still count?”) so you can stop early once the bound is reached.\n- For `Sudoku.java`: Make your entry point match the standard Java signature so the GUI can be launched directly by the runtime/IDE.\n\n### Code Style\n- Remove the `// TODO implement` comments once you’ve implemented the methods (or replace them with brief comments describing the recursion/base case).\n- Consider marking helper methods (`solved(model, fieldNr)` and `nofSolutions(model, fieldNr, max)`) clearly as “recursive backtracking” in a short comment; that makes the intent easier to read later.\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" : "boardIsValidAfterSolveN4()",
      "status" : "FAILED",
      "message" : "Board must contain exactly N queens ==> expected: <4> but was: <0>"
    }, {
      "name" : "boardIsValidAfterSolveN5()",
      "status" : "FAILED",
      "message" : "Board must contain exactly N queens ==> expected: <5> but was: <0>"
    }, {
      "name" : "boardIsValidAfterSolveN8()",
      "status" : "FAILED",
      "message" : "Board must contain exactly N queens ==> expected: <8> but was: <0>"
    }, {
      "name" : "boardSizeIsCorrectForN4()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "boardSizeIsCorrectForN8()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "countN1()",
      "status" : "FAILED",
      "message" : "N=1 has exactly 1 solution ==> expected: <1> but was: <0>"
    }, {
      "name" : "countN2()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "countN3()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "countN4()",
      "status" : "FAILED",
      "message" : "N=4 has exactly 2 solutions ==> expected: <2> but was: <0>"
    }, {
      "name" : "countN5()",
      "status" : "FAILED",
      "message" : "N=5 has exactly 10 solutions ==> expected: <10> but was: <0>"
    }, {
      "name" : "countN6()",
      "status" : "FAILED",
      "message" : "N=6 has exactly 4 solutions ==> expected: <4> but was: <0>"
    }, {
      "name" : "countN8()",
      "status" : "FAILED",
      "message" : "N=8 has exactly 92 solutions ==> expected: <92> but was: <0>"
    }, {
      "name" : "solveReturnsTrueForN1()",
      "status" : "FAILED",
      "message" : "N=1 has exactly one solution ==> expected: <true> but was: <false>"
    }, {
      "name" : "solveReturnsTrueForN4()",
      "status" : "FAILED",
      "message" : "N=4 has valid queen placements ==> expected: <true> but was: <false>"
    }, {
      "name" : "solveReturnsTrueForN8()",
      "status" : "FAILED",
      "message" : "N=8 has valid queen placements ==> expected: <true> but was: <false>"
    }, {
      "name" : "solveReturnsFalseForN2()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "solveReturnsFalseForN3()",
      "status" : "PASSED",
      "message" : null
    } ]
  }
}