{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Triangles.drawRec` (rekursiver Fall) berechnest du einen der Mittelpunkte falsch: beim zweiten rekursiven Aufruf verwendest du für den Punkt `(x1+x2)/2, y1` als “Mittelpunkt” zwischen `(x1,y1)` und `(x2,y2)` aber die y-Koordinate müsste auch gemittelt werden; sonst liegt der Punkt nicht auf der Kante und das Dreieck wird geometrisch verzerrt.\n\n### Suggestion\n- Schau dir für jede Dreiecksseite getrennt an, wie man den Mittelpunkt berechnet: jeweils **x und y** mitteln (also nicht nur x). Benenne dir gedanklich (oder als Variablen) die drei Mittelpunkte der Kanten und verwende dann genau diese drei Punkte, um die drei Unterdreiecke zu definieren.\n\n### Code Style\n- In `Triangles.drawRec` wiederholst du sehr viele identische Ausdrücke wie `(x1 + x0) / 2` und `(y0 + y1) / 2`; speichere diese Mittelpunkte in gut benannten Variablen (wie du es in der Beispiel-Idee sehen würdest), das macht den Code deutlich lesbarer und reduziert Fehler.\n- In `Boxes.drawRec` ist die Mischung aus rekursivem Aufruf für drei Quadranten und direktem `drawRect` für einen Quadranten ok, aber etwas inkonsistent; entweder konsequent rekursiv (mit `n=0`) oder konsequent direkt zeichnen, damit die Struktur klarer bleibt.\n- `Circles` ist im Projekt noch als TODO enthalten; falls das nicht Teil deiner Abgabe ist, ok—falls doch, ist das aktuell ungenutzter/unfertiger Code im Package.\n\n\n# Exercise: knapsack\n\n### Correctness\n\n\n### Suggestion\n\n\n### Code Style\n- In `pack`, du führst Buch darüber, wie viele Items du tatsächlich geladen hast (`loadeditems`), nur um danach wieder in einer zweiten Schleife zu entladen. Das funktioniert, macht den Backtracking-Teil aber unnötig umständlich – überlege dir, ob du das Entladen pro Rekursionszweig näher an den jeweiligen Ladevorgang koppeln kannst, sodass du weniger “Zähler-Logik” brauchst.\n- In `loadItem`/`unloadItem` verwendest du explizit `currWeight = currWeight + ...` statt der kürzeren Operatoren (`+=`, `-=`). Nicht falsch, aber weniger idiomatisch und schwerer zu lesen.\n- Kleinigkeit: `loadeditems` sollte nach Java-Konvention eher `loadedItems` heißen (camelCase).\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 gefunden und das Board bleibt leer.\n- `QueensSolver.count()` ist nicht implementiert und gibt immer `0` zurück, damit wird die Anzahl der Lösungen nie korrekt gezählt.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise eine Dame platziert und bei einem Konflikt wieder zurücknimmt (Queen setzen → rekursiv nächste Zeile → falls erfolglos Queen wieder entfernen).\n- Für `count()`: Nutze ein ähnliches Backtracking wie bei `solve()`, aber statt beim ersten Fund abzubrechen summierst du alle vollständigen Platzierungen (Basisfall “alle Zeilen belegt” liefert 1, sonst Summe der rekursiven Ergebnisse).\n- Achte in beiden Fällen darauf, dass du nach einem erfolglosen Versuch das Feld wieder auf `false` setzt, sonst “verschmutzt” der Zustand das weitere Suchen.\n\n### Code Style\n- In `Queens.java` ist `main()` nicht die übliche Java-Entry-Signatur (`static void main(String[] args)`), dadurch startet das Programm in vielen Setups nicht direkt.\n\n\n# Exercise: sudoku\n\n### Correctness\n- `nofSolutions` ist nicht implementiert und gibt immer `0` zurück; damit erfüllst du Anforderung 4 (Lösungen zählen, mit Abbruch bei `MAX`) nicht.\n- In `Sudoku.java` ist `main()` nicht `public static void main(String[] args)`; so startet die Applikation in Java nicht wie erwartet.\n\n### Suggestion\n- Für `nofSolutions`: Denk das Backtracking aus `solved` weiter, aber statt beim ersten Treffer `true` zurückzugeben, sammelst du pro vollständiger Belegung einen Zähler. Wichtig ist dabei, dass du nach jedem getesteten Wert wieder zurücksetzt (Backtracking) und dass du das `max`-Limit “nach unten” weiterreichst, damit du früh abbrechen kannst, sobald genug Lösungen gefunden sind.\n- Für `main`: Vergleiche die benötigte Java-Signatur für den Programmeinstieg mit deiner Methode; achte auf `public`, `static`, Rückgabetyp und Parameterliste.\n\n### Code Style\n- In `solved(...)` rufst du an mehreren Stellen `model.clear(i, j)` innerhalb der Schleife auf; das funktioniert zwar, macht den Kontrollfluss aber schwerer zu lesen. Überleg dir, ob du das “Zurücksetzen” eher an einer Stelle bündeln kannst (z.B. nur dann, wenn ein Kandidat nicht zum Erfolg führt).\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "allZero()",
"status" : "PASSED",
"message" : null
}, {
"name" : "uselessStuff()",
"status" : "PASSED",
"message" : null
}, {
"name" : "random1()",
"status" : "PASSED",
"message" : null
}, {
"name" : "random2()",
"status" : "PASSED",
"message" : null
}, {
"name" : "random3()",
"status" : "PASSED",
"message" : null
}, {
"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
} ]
}
}