{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes` ist `drawRec(...)` nicht implementiert; damit wird beim Zeichnen keine Form ausgegeben, obwohl die Aufgabe die rekursive Boxen-Form verlangt.\n- In `Triangles` ist `drawRec(...)` nicht implementiert; damit wird beim Zeichnen keine Form ausgegeben, obwohl die Aufgabe die rekursive Dreiecks-Form verlangt.\n\n### Suggestion\n- Für `Boxes.drawRec(...)`: Überlege dir eine **Abbruchbedingung** für die Rekursion (z.B. wenn `n == 0`) und zeichne dann **genau ein Rechteck** mit `g.drawRect(x, y, s, s)`. Im Rekursionsfall musst du das Quadrat in kleinere Quadrate aufteilen und die Methode mit angepassten `x/y/s` und `n-1` aufrufen.\n- Für `Triangles.drawRec(...)`: Auch hier zuerst eine **Basis** definieren (z.B. `n == 0`), in der du das Dreieck mit **drei Linien** zeichnest. Im Rekursionsfall brauchst du die **Mittelpunkte** der Dreiecksseiten (aus den gegebenen Eckpunkten berechnen) und rufst dann die Methode für die entstehenden kleineren Dreiecke mit `n-1` auf.\n\n### Code Style\n- Die `// TODO implement`-Kommentare sind okay während der Arbeit, aber sobald du fertig bist, sollten sie entfernt oder durch kurze, erklärende Kommentare ersetzt werden (z.B. “base case” / “recursive case”).\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `KnapsackImpl` sind `pack(int i)`, `loadItem(int i)` und `unloadItem(int i)` noch nicht implementiert; damit kann `solve()` kein korrektes Optimum berechnen und die Tests werden fehlschlagen.\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- Implementiere in `pack(i)` die rekursive Exploration so, dass du für jedes Item `i` alle erlaubten Anzahlen von `0` bis `maxN` durchprobierst und danach zum nächsten Index weitergehst; am Ende (wenn `i` über alle Items hinaus ist) aktualisierst du `maxValue`, falls Gewicht ok und Wert besser.\n- Achte darauf, dass du beim „Zurückgehen“ (Backtracking) den Zustand (`currWeight`, `currValue`) wieder exakt auf den Stand vor der Behandlung von Item `i` bringst; sonst schleppen spätere Rekursionszweige falsche Werte mit.\n- Falls deine Umgebung über `KnapsackN` startet: passe die `main`-Signatur so an, dass sie von Java als Einstiegspunkt erkannt wird.\n\n### Code Style\n- Die Methodennamen `loadItem`/`unloadItem` sind ok, aber benenne sie konsistent zu dem, was sie tun (z.B. „pack/unpack“), damit beim Lesen klar ist, dass es Backtracking-Schritte sind.\n- In `KnapsackN` fehlt `String[] args` in der `main`-Signatur; auch wenn es nicht immer zwingend ist, entspricht es dem Standard und vermeidet Verwirrung in Tools/Tests.\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\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise vorgeht: In jeder Zeile probierst du jede Spalte, setzt testweise eine Dame, gehst zur nächsten Zeile weiter, und wenn es nicht klappt, nimmst du die Dame wieder weg (Backtracking). Als Abbruchbedingung: Wenn du “hinter” der letzten Zeile bist, hast du eine vollständige Platzierung gefunden.\n- Für `count()`: Nutze die gleiche Backtracking-Struktur wie bei `solve()`, aber statt beim ersten Fund aufzuhören, summierst du alle vollständigen Platzierungen auf. Wichtig ist auch hier: Dame setzen → rekursiv weiterzählen → Dame wieder entfernen.\n\n### Code Style\n- In `Queens.java` ist `main()` nicht als Einstiegspunkt verwendbar: Es fehlt `static` und das `String[] args`-Argument (so wie es üblicherweise erwartet wird).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, both `solved(...)` and `nofSolutions(...)` are still unimplemented (`TODO`) and currently always return `false` / `0`, so the Sudoku is never solved and the number of solutions is never counted as required.\n- In `Sudoku.java`, your `main` method signature doesn’t match what Java expects as program entry point (`public static void main(String[] args)`), so the application won’t start when executed normally.\n\n### Suggestion\n- For `solved(...)`: think in terms of backtracking over the fields from `fieldNr = 0` to `size*size - 1`: if a field is already filled, skip to the next; if it’s empty, try values `1..size`, check validity with the checker, recurse, and if it doesn’t work undo your choice (clear the field).\n- For `nofSolutions(...)`: it’s similar to `solved(...)`, but instead of stopping at the first found solution you accumulate counts from recursive calls; also use the `max` parameter to stop exploring further once you reached the limit (to respect `SudokuSolver.MAX`).\n- For `Sudoku.java`: adjust the `main` method to the standard Java entry-point signature so the GUI can be launched by the runtime.\n\n### Code Style\n- Remove the `// TODO implement` placeholders once you’ve implemented the methods, or replace them with short comments that explain the recursion/base case if you want to keep documentation.\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
} ]
}
}