{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Triangles.drawRec` zeichnest du im Basisfall (`n == 0`) die dritte Kante als `(x0,y0) -> (x2,y2)`; damit schliesst du das Dreieck zwar, aber du benutzt nicht die Kante `(x2,y2) -> (x0,y0)` wie sie aus den übergebenen Eckpunkten konsistent “rundherum” entstehen würde (bei deiner Variante ist es zwar die gleiche Strecke, aber du überspringst die Verbindung über den dritten Punkt in der Reihenfolge, was bei Rekursion/Weitergabe der Punkte schnell zu Verwechslungen führt).\n- In `Triangles.drawRec` sind deine Mittelpunkte/Unterdreiecke nicht überall als “echte Mittelpunkte der jeweiligen Kanten” gebildet: Beim zweiten rekursiven Aufruf verwendest du für den dritten Punkt `(x1 + x2) / 2, y1` statt den Mittelpunkt zwischen `(x1,y1)` und `(x2,y2)` (also auch `y` gemittelt). Dadurch entstehen bei schiefen/anderen Dreiecken falsche Teil-Dreiecke.\n\n### Suggestion\n- Schau dir beim Dreieck die drei Kanten an und berechne für **jede Kante** sauber den Mittelpunkt aus beiden Endpunkten (`(xA+xB)/2` und `(yA+yB)/2`). Wenn du diese drei Mittelpunkte hast, kannst du die drei rekursiven Dreiecke eindeutig zusammensetzen.\n- Prüfe speziell beim “rechten unteren” Teil-Dreieck, ob du wirklich den Mittelpunkt der Kante zwischen den passenden zwei Eckpunkten nimmst (nicht einfach `y1` übernehmen). Ein guter Test ist: Würde dein Code auch funktionieren, wenn das Startdreieck nicht symmetrisch/gleichschenklig ist?\n\n### Code Style\n- In `Triangles.drawRec` stehen `// TODO implement` und danach ist es implementiert; den Kommentar kannst du entfernen, damit der Status klar ist.\n- Bei `Triangles.drawRec` wiederholst du viele Ausdrücke wie `(x1 + x0) / 2` mehrfach inline. Das wird schnell unübersichtlich; leg die Mittelpunkte in gut benannten Variablen ab (z.B. `mx01`, `my01`, …), dann sieht man die Geometrie sofort.\n- In `Boxes.drawRec` wäre es lesbarer, wenn du die vier Teilquadrate in einer konsistenten Reihenfolge (z.B. oben links, oben rechts, unten rechts, unten links) zeichnest und die Offsets/Grössen ggf. kurz in Variablen speicherst (z.B. `half = s/2`).\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()` keinen korrekten Optimalwert berechnen und die mitgelieferten Tests werden so nicht bestehen.\n- In `KnapsackN` hat `main()` nicht die übliche Signatur `main(String[] args)`; je nach Test/Runner wird dein Programm dadurch evtl. gar nicht gestartet.\n\n### Suggestion\n- Implementiere in `pack(i)` die rekursive/iterative Suche so, dass du für jeden Gegenstand nicht nur „0 oder 1-mal“, sondern „0 bis maxN-mal“ ausprobieren kannst, und zwar unter Beachtung von `maxWeight`.\n- Achte darauf, dass du beim Backtracking den Zustand (`currWeight`, `currValue`) nach dem Ausprobieren wieder exakt auf den vorherigen Wert zurücksetzt (insbesondere wenn du einen Gegenstand mehrfach geladen hast).\n- Passe die `main`-Methode auf die Standard-Signatur an, falls deine Ausführungsumgebung/Tests das erwarten.\n\n### Code Style\n- Die Methoden heißen in deiner Vorlage `loadItem/unloadItem`, im Beispiel wird `packItem/unpackItem` verwendet: entscheide dich für eine konsistente Benennung (und entferne/ersetze nicht verwendete Varianten).\n- `KnapsackN.main()` ist package-private und ohne Args; üblich ist `public static void main(String[] args)` (auch wenn es nicht zwingend Teil der Knapsack-Logik ist).\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und gibt immer `false` zurück, damit wird keine Lösung gesucht/gefunden und das Board wird nie befüllt.\n- `QueensSolver.count()` ist nicht implementiert und gibt immer `0` zurück, damit wird die Anzahl Lösungen nicht gezählt.\n\n### Suggestion\n- Für `solve()`: Du brauchst eine Backtracking-Logik, die zeilenweise (oder spaltenweise) eine Dame setzt, jeweils mit `checkPlacement(...)` prüft und bei einem Fehlschlag wieder entfernt (Rücksetzen des `board[row][col]`), bis entweder eine vollständige Platzierung erreicht ist oder alle Möglichkeiten ausprobiert sind.\n- Für `count()`: Sehr ähnlich wie `solve()`, aber statt beim ersten Treffer aufzuhören musst du alle möglichen Platzierungen durchprobieren und die Anzahl vollständiger Platzierungen aufsummieren; wichtig ist auch hier, dass du nach dem rekursiven Schritt die gesetzte Dame wieder entfernst.\n\n### Code Style\n- In `Queens.java` ist `main()` nicht als üblicher Java-Entry-Point deklariert (`static void main(String[] args)`), dadurch startet das Programm typischerweise nicht automatisch.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, both `solved(...)` and `nofSolutions(...)` are still unimplemented and currently always return `false` / `0`, so the Sudoku is never solved and solutions are never counted.\n- In `Sudoku.java`, `main` is not declared as `public static void main(String[] args)`, so the program won’t start via the standard Java entry point (depending on how it’s executed/tested).\n\n### Suggestion\n- For the solver: think in terms of backtracking over the fields from `fieldNr = 0` up to `size*size - 1`: if a field is prefilled, recurse to the next field; if it’s empty, try values `1..size`, check validity with the checker, recurse, and undo (clear) on failure.\n- For counting solutions: reuse the same recursion idea, but instead of stopping at the first found solution, accumulate counts from recursive calls; also ensure you stop early once you reach the given `max` bound and that the model is left in its initial state when the method returns.\n- For `main`: compare your method signature with Java’s required entry method signature; make sure it matches exactly so the GUI can launch.\n\n### Code Style\n- The `// TODO implement` placeholders are fine during development, but once you implement the methods, remove the TODO comments to avoid looking like incomplete work.\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
} ]
}
}