{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` fehlt ein vierter Rekursionszweig (unten links). Damit werden pro Ebene nur 3 statt 4 Teilquadrate gezeichnet, die Form entspricht nicht der geforderten Boxen-Fraktalstruktur.\n- In `Boxes.drawRec` ist der Abbruchfall auf `n == 1` gesetzt; im restlichen Programm wird `n` aber auch bis `0` heruntergeregelt. Bei `n == 0` läuft deine Rekursion weiter und `n` wird negativ, wodurch sie nie stoppt.\n- In `Triangles.drawRec` ist der Abbruchfall ebenfalls `n == 1`; auch hier kann `n` zu `0` werden und dann endet die Rekursion nicht mehr (läuft ins Negative).\n\n### Suggestion\n- Überlege dir für beide Rekursionen einen Abbruchfall, der auch dann greift, wenn `n` auf `0` gesetzt wird (siehe Tastatursteuerung in `Fractal`).\n- Bei den Boxen: Schau dir an, welche vier Quadranten ein Quadrat beim Halbieren hat, und prüfe, ob du wirklich alle vier Bereiche zeichnest (ein Bereich fehlt aktuell).\n- Teste explizit mit `n = 0` (z.B. per `s` runterdrücken) und beobachte, ob noch etwas gezeichnet wird bzw. ob das Programm hängen bleibt — das zeigt dir sofort, ob dein Basisfall passt.\n\n### Code Style\n- In `Fractal` hast du die Startwerte (`n = 8`, `currShape = 1`) geändert; das ist nicht falsch, kann aber unnötig vom Template abweichen und erschwert Vergleiche beim Korrigieren/Debuggen.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(int i)` verwendest du `if (i == maxN)` als Abbruchbedingung, aber `i` ist der Index durch die Item-Typen (also muss gegen `weights.length`/`values.length` geprüft werden), nicht gegen `maxN` (das ist die maximale Anzahl pro Item-Typ).\n- Durch die falsche Abbruchbedingung kann es bei `maxN > weights.length` zu einem Zugriff auf `weights[i]`/`values[i]` außerhalb des Arrays kommen.\n- Du aktualisierst `maxValue` ohne zu prüfen, ob `currWeight <= maxWeight`. Zwar brichst du in der Schleife bei Überschreitung ab, aber die Lösungsspeicherung ist nicht explizit an die Gewichtsbedingung gekoppelt (und die Rekursion kann auch in anderen Konstellationen an der falschen Stelle enden).\n\n### Suggestion\n- Überlege dir, was `i` in deiner Rekursion fachlich bedeutet: Zählst du Item-Typen durch oder zählst du “wie viele Stück insgesamt”? Die Abbruchbedingung sollte genau dazu passen.\n- Stell sicher, dass du niemals `weights[i]`/`values[i]` liest, wenn `i` nicht mehr ein gültiger Index ist; die Rekursion sollte genau dann enden, wenn alle Item-Typen “entschieden” sind.\n- Wenn du `maxValue` setzt, koppel das direkt an die Zulässigkeit des aktuellen Zustands (Gewichtslimit), damit wirklich nur gültige Packungen als Optimum zählen.\n\n### Code Style\n- `KnapsackN.main()` hat nicht die übliche Java-Signatur `main(String[] args)`, was das direkte Starten außerhalb der Übungsumgebung erschweren kann.\n- Die Kommentare sind hilfreich, aber teils etwas irreführend (z.B. “alle Items entschieden” bei `i == maxN`), weil `maxN` nicht die Anzahl Item-Typen ist; benenne/kommentiere so, dass klar ist, ob es um Item-Index oder Stückzahl geht.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und gibt immer `false` zurück, dadurch wird keine Lösung gefunden und das Board bleibt leer.\n- `QueensSolver.count()` ist nicht implementiert und gibt immer `0` zurück, dadurch wird die Anzahl Lösungen nicht gezählt.\n- In `Queens.java` ist `main()` nicht als Einstiegspunkt ausführbar (Signatur weicht von `static void main(String[] args)` ab), dadurch startet das Programm in der Regel nicht wie erwartet.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise arbeitet: In jeder Zeile eine Spalte ausprobieren, nur setzen wenn `checkPlacement(...)` true liefert, dann mit der nächsten Zeile weitermachen; wenn es später scheitert, die Dame wieder entfernen (Backtracking).\n- Für `count()`: Nutze ein sehr ähnliches rekursives Schema wie bei `solve()`, aber statt beim ersten Fund abzubrechen, addierst du alle gefundenen Komplettlösungen auf; wichtig ist auch hier das Zurücksetzen des Feldes nach dem rekursiven Aufruf.\n- Für `main()`: Vergleiche die Methode in deiner `Queens`-Klasse mit der üblichen Java-`main`-Signatur, damit die Klasse direkt ausführbar ist.\n\n### Code Style\n- In `getBoard()` ist `return this.board;` zwar okay, aber in deinem restlichen Code nutzt du `board` ohne `this`; entscheide dich konsistent für einen Stil.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `nofSolutions(...)` wird das `max`-Limit bei rekursiven Aufrufen nicht korrekt weitergegeben: du rufst immer mit demselben `max` weiter, obwohl bereits Lösungen gefunden wurden; dadurch kann die Methode deutlich mehr als `MAX` Lösungen zählen, obwohl sie laut Aufgabe bei `MAX` abbrechen soll.\n- In `nofSolutions(...)` wird beim Abbruchfall (`count >= max`) `count` zurückgegeben, das größer als `max` sein kann; damit kann der Rückgabewert über dem geforderten Limit liegen.\n- `Sudoku.main()` hat nicht die erwartete Java-Signatur (`public static void main(String[] args)`), wodurch die Applikation so typischerweise nicht startbar ist.\n\n### Suggestion\n- Überlege bei `nofSolutions`, wie viele Lösungen du “noch” suchen darfst, wenn du schon `count` gefunden hast. Der rekursive Aufruf sollte mit einem entsprechend kleineren Restbudget arbeiten.\n- Achte darauf, dass du beim Überschreiten des Limits nicht “drüberzählst”: Wenn ein rekursiver Aufruf z.B. 5 liefert, aber nur noch 2 erlaubt sind, sollte dein Zähler nicht auf `count + 5` wachsen.\n- Schau dir an, wie Java Programme den Einstiegspunkt definieren: die `main`-Methode muss statisch sein und ein `String[]` akzeptieren, sonst wird sie vom Launcher nicht gefunden.\n\n### Code Style\n- In `nofSolutions(...)` rufst du `model.clear(row, col)` sowohl im Abbruchzweig als auch direkt danach im Loop auf; das ist redundant und macht den Kontrollfluss schwerer zu lesen.\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" : "FAILED",
"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
} ]
}
}