{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Triangles.drawRec(...)` fehlt sowohl der Basisfall (das eigentliche Zeichnen des Dreiecks mit `g.drawLine(...)`) als auch der rekursive Fall (Aufteilen in kleinere Dreiecke und rekursives Weiterzeichnen). Damit wird für `Triangles` aktuell gar nichts gezeichnet.\n\n### Suggestion\n- Überlege dir für `Triangles` zuerst den Basisfall: Welche 3 Linien brauchst du, um aus den Punkten `(x0,y0)`, `(x1,y1)`, `(x2,y2)` ein Dreieck zu zeichnen?\n- Für den rekursiven Schritt: Berechne die Mittelpunkte der drei Dreiecksseiten (jeweils aus zwei Eckpunkten den Mittelwert von x und y). Mit diesen drei Mittelpunkten kannst du das große Dreieck in mehrere kleinere Dreiecke zerlegen.\n- Achte darauf, dass du beim rekursiven Aufruf `n` zuverlässig verringerst (z.B. `n-1`) und dass du genau die Teil-Dreiecke rekursiv zeichnest, die zur gewünschten Fraktalform gehören.\n\n### Code Style\n- In `Triangles.drawRec(...)` ist ein leerer `if (n == 0) { }`-Block drin; entweder implementieren oder entfernen, damit klar ist, was passieren soll.\n- Der Kommentar `// TODO implement` steht noch in `Triangles` (und `Circles`), obwohl die eigentliche Aufgabe nur `Boxes` und `Triangles` verlangt—halte TODOs möglichst nur dort, wo du wirklich noch weiterarbeitest.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `pack(int i)` ist nicht implementiert, damit kann `solve()` nie das korrekte Optimum finden.\n- `loadItem(int i)` und `unloadItem(int i)` sind nicht implementiert, daher kann das Programm keine Gegenstände (auch nicht n‑mal) in den aktuellen Zustand ein-/ausladen.\n- `KnapsackN.main()` hat keine korrekte Java-Signatur (`static void main(String[] args)`), dadurch lässt sich das Programm typischerweise nicht direkt ausführen (auch wenn die Tests ggf. nur `KnapsackImpl` prüfen).\n\n### Suggestion\n- Überlege dir für `pack(i)`, wie du rekursiv durch die Item-Liste gehst und pro Item nicht nur „0 oder 1“, sondern „0 bis maxN“ Exemplare ausprobierst (also eine Schleife pro Item-Zweig).\n- Achte in der Rekursion darauf, wann du abbrechen solltest (z.B. wenn das Gewicht schon über dem Maximum ist) und wann du den aktuellen Wert als Kandidat für `maxValue` prüfst (typisch im Basisfall, wenn alle Items betrachtet sind).\n- Für `loadItem/unloadItem`: Halte den Zustand (`currWeight`, `currValue`) konsistent, d.h. jede Änderung beim „Laden“ muss später beim Backtracking zuverlässig rückgängig gemacht werden (insbesondere wenn du ein Item in einer Schleife mehrfach lädst).\n- Passe die `main`-Methode in `KnapsackN` an die übliche Signatur an, falls du das Programm lokal starten willst.\n\n### Code Style\n- Die Methoden `pack`, `loadItem`, `unloadItem` sind als TODO leer; solange das so ist, ist der Code unvollständig und schwer testbar.\n- Benennung ist uneinheitlich im Vergleich zur Aufgabenlogik: Wenn du `loadItem/unloadItem` verwendest, achte darauf, dass klar ist, ob „unload“ ein Exemplar oder gleich alle `maxN` Exemplare entfernt (das sollte sich im Namen oder in der Implementationslogik widerspiegeln).\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.\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()`: Du brauchst eine Backtracking-Rekursion, die zeilenweise vorgeht (z.B. „in welcher Spalte platziere ich in dieser Zeile eine Dame?“), jede mögliche Platzierung mit `checkPlacement(row, col)` prüft und bei Erfolg in die nächste Zeile geht; wenn du später scheiterst, musst du die gesetzte Dame wieder entfernen (Backtracking).\n- Für `count()`: Sehr ähnlich wie `solve()`, aber statt beim ersten Fund abzubrechen, summierst du alle vollständigen Platzierungen; achte darauf, beim Rückweg aus der Rekursion die Dame wieder zu entfernen, sonst verfälschst du weitere Zählpfade.\n\n### Code Style\n- In `Queens.java` ist `main()` nicht als `static void main(String[] args)` deklariert; so startet das Programm in Java typischerweise nicht direkt (auch wenn das nicht Teil der eigentlichen Backtracking-Aufgabe ist).\n- In `getBoard()` ist `return this.board;` zwar ok, aber in der Vorlage wird konsistent ohne `this` zurückgegeben; entscheide dich für einen einheitlichen Stil.\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.\n- In `SudokuSolverImpl`, `nofSolutions(SudokuModel model, int fieldNr, int max)` is not implemented and always returns `0`, so solution counting will never work.\n- In `Sudoku.java`, the entry point is not a valid Java `main` method (`void main()` instead of `public static void main(String[] args)`), so the application won’t start as required.\n\n### Suggestion\n- For `solved(...)`: think of backtracking with a recursion anchor: what should happen when you have processed all `size()*size()` fields? Also consider how to skip fields that are already pre-filled (`model.get(i,j) != 0`) and how to undo a guess (`clear`) when it doesn’t lead to a solution.\n- For `nofSolutions(...)`: use almost the same traversal as in `solved`, but instead of returning as soon as you find one valid completion, accumulate a counter over all valid branches; also keep an eye on the `max` limit (stop exploring deeper once you’ve already found enough).\n- For `Sudoku.java`: compare your method signature to what the JVM looks for as program entry point; it must be `static`, take `String[]`, and be accessible from outside.\n\n### Code Style\n- Remove the `// TODO implement` placeholders once implemented; if you keep comments, make them describe the algorithm (anchor case, recursion step, backtracking) rather than “TODO”.\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
} ]
}
}