{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du das aktuelle Rechteck in *jedem* Rekursionsschritt und brichst erst bei `n < 0` ab; damit entspricht die Rekursionstiefe nicht dem Parameter `n` (bei `n == 0` wird weiter rekursiv gezeichnet).\n- In `Boxes.drawRec` fehlt der vierte Teil (unten links) der Aufteilung: du rufst nur drei der vier Teilquadrate rekursiv auf.\n- In `Triangles.drawRec` zeichnest du das Dreieck in *jedem* Rekursionsschritt und brichst erst bei `n < 0` ab; auch hier wird bei `n == 0` weiter rekursiv gezeichnet, also passt die Rekursionstiefe nicht zu `n`.\n\n### Suggestion\n- Überlege dir für beide Shapes einen klaren **Basisfall** bei dem *nur* gezeichnet wird und **keine** weiteren rekursiven Aufrufe mehr passieren (achte darauf, bei welchem `n` das sein soll).\n- Lege fest, was bei `n > 0` passieren soll: typischerweise teilst du die Form auf und rufst die Teilformen mit `n - 1` auf, **ohne** zusätzlich jedes Mal die “große” Form erneut zu zeichnen.\n- Bei den Boxes: Prüfe systematisch die vier Quadranten nach dem Halbieren (`(x,y)`, `(x+s/2,y)`, `(x,y+s/2)`, `(x+s/2,y+s/2)`) und ob du wirklich alle Bereiche abdeckst, die die Aufgabe/Fraktalfigur erwartet.\n- Bei den Triangles: Wenn du mit Mittelpunkten arbeitest (machst du schon), dann kontrolliere, dass du bei `n > 0` nur die drei “Teil-Dreiecke” weiterverfolgst und dass dein Abbruchkriterium verhindert, dass `n` ins Negative läuft.\n\n### Code Style\n- Verwende lieber ein explizites Abbruchkriterium wie `if (n == 0) { ... } else { ... }` statt `if (n < 0) return;` — das macht die Rekursionslogik leichter nachvollziehbar.\n- In `Boxes.drawRec`: `s = s / 2;` mutiert den Parameter; lesbarer ist es oft, dafür eine neue Variable (z.B. `half`) zu verwenden, damit klar bleibt, wofür `s` im aktuellen Stackframe steht.\n- Auskommentierten Code (die auskommentierte `drawRec(...)`-Zeile in `Triangles`) entfernen, sobald du dich für eine Variante entschieden hast.\n\n\n# Exercise: knapsack\n\n### Correctness\n- Du berücksichtigst `maxN` in deiner Rekursion nicht: aktuell kann jeder Gegenstand nur 0- oder 1-mal eingepackt werden, obwohl die Aufgabe verlangt, dass man ihn bis zu `maxN`-mal mitnehmen kann.\n- Durch `loadItem(i)` genau einmal und danach `unloadItem(i)` genau einmal entsteht wieder das klassische 0/1-Knapsack und nicht die “n gleiche Gegenstände”-Variante.\n\n### Suggestion\n- Überlege dir, wie du in `pack(i)` nicht nur die zwei Fälle “nicht nehmen” und “einmal nehmen” abdeckst, sondern auch “zweimal nehmen”, “dreimal nehmen”, … bis `maxN` (oder bis das Gewicht limitierend wird). Das deutet auf eine Schleife oder eine rekursive Zähl-Variante pro Item hin.\n- Wenn du ein Item mehrfach lädst, achte darauf, dass du beim “Aufräumen” (Backtracking) den Zustand (`currWeight`, `currValue`) wieder korrekt auf den Stand vor dem Item zurücksetzt (also nicht nur um 1 Stück zurück, wenn du es vorher mehrfach hinzugefügt hast).\n\n### Code Style\n- In `KnapsackN` fehlt die übliche `main`-Signatur mit `String[] args`; je nach Testumgebung kann das störend sein.\n- Du hast einige `// TODO implement` Kommentare stehen, obwohl der Code darunter schon implementiert ist; das kann verwirren und sollte entfernt/aktualisiert werden.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl.solved`: Wenn ein Feld schon vorgegeben ist (`model.get(row,col) != 0`), rufst du zwar rekursiv `solved(model, fieldNr + 1)` auf, ignorierst aber dessen Rückgabewert und gibst direkt `true` zurück. Damit kann die Methode `true` liefern, auch wenn später keine Lösung existiert.\n- `nofSolutions` ist noch nicht implementiert und gibt immer `0` zurück, damit wird die Anforderung “Anzahl Lösungen zählen” nicht erfüllt.\n- In `Sudoku.java` ist `main()` nicht die Java-Entry-Point-Signatur (`public static void main(String[] args)`), dadurch startet die Applikation so nicht wie erwartet.\n\n### Suggestion\n- Beim Fall “vorgefülltes Feld”: Überlege dir, was passieren soll, wenn der rekursive Aufruf für den Rest des Sudokus `false` liefert. Solltest du dann wirklich “einfach true” zurückgeben, oder musst du das Ergebnis “durchreichen”?\n- Für `nofSolutions`: Nimm deine Backtracking-Idee aus `solved`, aber statt beim ersten Fund abzubrechen, zählst du pro vollständiger Belegung eine Lösung hoch. Achte dabei darauf, dass du nach jedem Test eines Werts das Feld wieder zurücksetzt (Backtracking), und dass du das `max`-Limit (MAX) beim Rekursionsabstieg korrekt “verbleibend” weitergibst.\n- Für `Sudoku.java`: Prüfe, welche `main`-Signatur die JVM tatsächlich als Startpunkt erkennt und passe sie entsprechend an.\n\n### Code Style\n- In `solved` sind viele Kommentar-Fragen/Notizen im Code; wenn du fertig bist, reduziere das auf kurze, präzise Kommentare (z.B. “Abbruchbedingung”, “vorgefülltes Feld”, “Wert ausprobieren/Backtracking”), damit die Logik leichter lesbar bleibt.\n- Vermeide Magic Numbers wie `81`, `9` mehrfach im Solver: nutze stattdessen `model.size()` (und daraus abgeleitet `model.size()*model.size()`), dann funktioniert der Code auch für andere Sudoku-Grössen und ist konsistenter.\n\n\n# Exercise: queens\n\nLlm Evaluation ist für diese Aufgabe deaktiviert. Entferne die .llmignore Datei vom Package der Aufgabe.\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: <174>"
}, {
"name" : "random2()",
"status" : "FAILED",
"message" : "expected: <340> but was: <279>"
}, {
"name" : "random3()",
"status" : "FAILED",
"message" : "expected: <558> but was: <357>"
}, {
"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
} ]
}
}