{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes` ist die rekursive Zeichenmethode `drawRec(...)` nicht implementiert; damit wird keine Box-Fraktalform gezeichnet.\n- In `Triangles` ist die rekursive Zeichenmethode `drawRec(...)` nicht implementiert; damit wird keine Dreiecks-Fraktalform gezeichnet.\n\n### Suggestion\n- Für `Boxes.drawRec(...)`: Überlege dir eine Abbruchbedingung (z.B. bei `n == 0`), in der du genau *ein* Quadrat/Rechteck zeichnest, und einen rekursiven Fall, in dem du das aktuelle Quadrat in kleinere Teilquadrate zerlegst und für diese mit `n-1` weiterzeichnest.\n- Für `Triangles.drawRec(...)`: Setze ebenfalls einen Basisfall (bei `n == 0` ein Dreieck mit drei `drawLine(...)`-Aufrufen) und berechne im rekursiven Fall die Mittelpunkte der Dreiecksseiten, um daraus die kleineren Dreiecke zu bestimmen, die du rekursiv weiterzeichnest.\n\n### Code Style\n- Die `// TODO implement`-Platzhalter sind noch drin; wenn du anfängst zu implementieren, ersetze die TODO-Kommentare durch sinnvolle Kommentare (z.B. was Basisfall/rekursiver Fall macht) oder entferne sie, wenn sie nicht mehr helfen.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `KnapsackImpl` sind `pack(int i)`, `loadItem(int i)` und `unloadItem(int i)` nicht implementiert; damit kann `solve()` keine optimale Lösung berechnen und die mitgelieferten Tests werden so nicht bestehen.\n- In `KnapsackN` hat `main()` nicht die übliche Signatur `main(String[] args)`; je nach Test-/Run-Setup wird das Programm so evtl. nicht als Startpunkt erkannt.\n\n### Suggestion\n- Für `pack(i)`: Du brauchst eine rekursive/iterative Exploration, die pro Item nicht nur „nehmen/liegen lassen“ abdeckt, sondern „0 bis maxN mal nehmen“ – und danach mit dem nächsten Item weitermacht. Achte dabei darauf, wann du den aktuellen Zustand als Kandidat für `maxValue` prüfst (typisch: wenn du beim letzten Item angekommen bist).\n- Für `loadItem/unloadItem`: Überlege dir, wie du `currWeight` und `currValue` konsistent änderst, wenn du ein Item einmal dazulädst, und wie du nach der Schleife/Backtracking-Phase wieder exakt auf den vorherigen Zustand zurückkommst (insbesondere wenn du ein Item mehrfach geladen hast).\n- Für `main`: Falls die Tests/Umgebung `public static void main(String[] args)` erwarten, passe die Signatur entsprechend an.\n\n### Code Style\n- Die Methode heißt bei dir `loadItem/unloadItem`, im Beispiel wird oft `packItem/unpackItem` verwendet; wähle eine konsistente, sprechende Benennung (und halte sie überall gleich), damit beim Lesen klar ist, dass es Backtracking-Schritte sind.\n- `KnapsackN.main()` ist package-private (`static void main()`), nicht `public`; auch das ist für einen Einstiegspunkt unüblich und kann beim Ausführen irritieren.\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.main()` fehlt die korrekte Java-Entry-Point-Signatur (`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 vorgeht: In einer Zeile jede Spalte ausprobieren, bei gültiger Platzierung weitermachen, und wenn es später nicht klappt, die Dame wieder entfernen (Backtracking).\n- Für `count()`: Ähnlich wie `solve()`, aber statt beim ersten Fund abzubrechen, alle gültigen Platzierungen weiterverfolgen und die Anzahl der vollständigen Platzierungen aufsummieren.\n- Für `main()`: Prüfe, welche Methodensignatur Java als Programmeinstieg akzeptiert (Stichwort: `public/static`, Argumente).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, sowohl `solved(...)` als auch `nofSolutions(...)` sind nicht implementiert und liefern aktuell immer `false` bzw. `0`; damit wird das Sudoku nie gelöst und die Anzahl Lösungen immer falsch gezählt.\n- `Sudoku.solved(...)` verlangt: wenn **keine** Lösung existiert, muss das Model auf den **Initialzustand** zurückgesetzt werden; mit der aktuellen (nicht vorhandenen) Backtracking-Implementierung ist diese Anforderung nicht erfüllt.\n- `Sudoku.nofSolutions(...)` verlangt: das Model muss am Ende wieder im **Initialzustand** sein; aktuell passiert das nicht (bzw. es wird gar nicht erst korrekt gesucht/gezählt).\n\n### Suggestion\n- Für `solved(model, fieldNr)`: Überleg dir eine Rekursions-/Abbruchbedingung, die erkennt, wann alle Felder verarbeitet sind (z.B. wenn `fieldNr` das Ende erreicht) und wie du `fieldNr` auf `(i, j)` abbildest.\n- Behandle zwei Fälle getrennt: Feld ist schon vorgegeben (`get(i,j) != 0`) → zum nächsten Feld; Feld ist leer → probiere Werte `1..size()` aus, setze sie testweise und prüfe mit `checker.oneOK(...)`, ob du weiterrechnen darfst.\n- Denk beim Backtracking daran: wenn keiner der getesteten Werte zu einer Lösung führt, musst du das Feld wieder leeren, bevor du zurückkehrst (sonst bleibt “Müll” im Model).\n- Für `nofSolutions(...)`: Statt beim ersten Fund abzubrechen, sammelst du die Anzahl Lösungen aus den rekursiven Aufrufen. Achte darauf, dass du trotzdem früh stoppen kannst, sobald `MAX` erreicht ist (z.B. über den Parameter `max`/Restbudget).\n- Für die “Model zurücksetzen”-Anforderung bei `nofSolutions`: Stelle sicher, dass du beim Verlassen eines Rekursionszweigs das gerade belegte Feld wieder `clear(...)`st (auch wenn du wegen `max` früh abbrichst).\n\n### Code Style\n- In `Sudoku.java` ist `main` nicht `public static void main(String[] args)`. Auch wenn das nicht Teil der eigentlichen Solver-Aufgabe ist, kann das Starten der Applikation so scheitern bzw. von Tests/Runnern nicht gefunden werden.\n- Die `// TODO implement`-Platzhalter sind okay während der Arbeit, aber spätestens zur Abgabe sollten sie verschwinden bzw. durch sinnvolle Kommentare ersetzt werden.\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
} ]
}
}