{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec(...)` zeichnest du im Rekursionsfall nur 3 der 4 Teil-Quadrate; dadurch entsteht nicht die geforderte Box-Fraktal-Form (ein Quadrant fehlt).\n- `Triangles.drawRec(...)` ist nicht implementiert; damit wird die Dreiecks-Fraktal-Form gar nicht gezeichnet.\n\n### Suggestion\n- Überlege bei `Boxes`: Wenn du ein Quadrat in vier gleich große Quadranten teilst, welche (x,y)-Startkoordinaten haben alle vier Teilquadrate? Vergleiche die Offsets für oben-links, oben-rechts, unten-links, unten-rechts – aktuell fehlt einer davon.\n- Für `Triangles`: Starte mit einem klaren Basisfall (`n == 0`), der ein Dreieck wirklich zeichnet (also alle drei Kanten). Für den Rekursionsfall: Berechne die Mittelpunkte der drei Dreiecksseiten und rufe dann die Rekursion für die Teil-Dreiecke auf, die übrig bleiben (typisch sind es drei kleinere Dreiecke).\n\n### Code Style\n- In `Boxes.drawRec(...)` steht noch ein `// TODO implement` Kommentar, obwohl du schon implementiert hast – den kannst du entfernen, damit der Status klar ist.\n- In `Boxes.drawRec(...)` ist die Einrückung/Spacing uneinheitlich (z.B. `drawRec(g,x+(s/2),y,s/2,n-1);`); einheitliche Leerzeichen nach Kommas und um Operatoren machen es deutlich lesbarer.\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 Maximalwert berechnen und die Tests werden scheitern.\n- In `KnapsackN` hat `main()` keine korrekte Java-Signatur (`static void main(String[] args)` wird erwartet); so lässt sich das Programm typischerweise nicht direkt starten.\n\n### Suggestion\n- Überlege dir für `pack(i)` die Rekursions-/Backtracking-Struktur: du musst pro Item nicht nur „0 oder 1 Mal“, sondern „0 bis maxN Mal“ entscheiden und danach jeweils mit dem nächsten Item weitermachen.\n- Achte darauf, dass du beim Rekursionsende (wenn alle Items betrachtet sind) `maxValue` nur dann aktualisierst, wenn das aktuelle Gewicht innerhalb `maxWeight` liegt.\n- Für `loadItem`/`unloadItem`: stelle sicher, dass nach dem Durchprobieren verschiedener Anzahlen eines Items der Zustand (`currWeight`, `currValue`) wieder exakt auf den Stand vor dem Item zurückgesetzt wird (sonst „verschleppt“ sich Gewicht/Wert in andere Zweige).\n- Passe die `main`-Methode auf die übliche Java-Form an, falls deine Abgabe auch ausführbar sein soll (nicht nur über Tests).\n\n### Code Style\n- Die Methoden heißen bei dir `loadItem`/`unloadItem`, während in vielen Lösungen eher ein konsistentes Begriffspaar wie `packItem`/`unpackItem` verwendet wird; wähle eine klare, durchgängige Terminologie (laden/entladen oder packen/auspacken).\n- In `KnapsackN` ist `main()` ohne Parameter unüblich; selbst wenn Tests das nicht nutzen, ist die Standard-Signatur erwartbarer und reduziert Verwirrung.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, damit wird keine Lösung gefunden und auch kein Board befüllt.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl Lösungen nicht gezählt.\n- In `Queens` ist die `main`-Methode nicht als Java-Entry-Point definiert (Signatur passt nicht), dadurch startet das Programm so nicht wie erwartet.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise vorgeht: in jeder Zeile eine Spalte ausprobieren, nur setzen wenn `checkPlacement(row, col)` true ist, und bei Misserfolg die gesetzte Dame wieder entfernen (Backtracking).\n- Für `count()`: Nutze ein sehr ähnliches Rekursionsschema wie bei `solve()`, aber statt beim ersten Fund abzubrechen summierst du alle vollständigen Platzierungen; wichtig ist auch hier das Zurücksetzen des Feldes nach dem rekursiven Schritt.\n- Für `main`: Prüfe, welche Methodensignatur Java als Startpunkt erwartet (Parameter, `static`, Rückgabetyp), und passe deine Methode daran an.\n\n### Code Style\n- In `getBoard()` ist `return this.board;` ok, aber in diesem Projekt wird teils ohne `this` gearbeitet; bleib am besten konsequent bei einem Stil.\n- Die TODO-Kommentare in `solve()`/`count()` sind ok während der Arbeit, sollten aber verschwinden, sobald du fertig bist.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl.solved(...)`/`solved(model, fieldNr)` ist der Backtracking-Algorithmus nicht implementiert und gibt aktuell immer `false` zurück, dadurch wird nie eine Lösung gefunden.\n- In `SudokuSolverImpl.nofSolutions(...)`/`nofSolutions(model, fieldNr, max)` ist die Zähl-Logik nicht implementiert und gibt aktuell immer `0` zurück, dadurch werden Lösungen nie gezählt.\n- Die Anforderung für `solved`: Bei “keine Lösung” muss das Modell auf den initialen Zustand zurückgesetzt werden; mit der aktuellen (leeren) Implementierung ist dieses Verhalten nicht sichergestellt.\n- Die Anforderung für `nofSolutions`: Das Modell muss nach dem Zählen wieder auf den initialen Zustand zurückgesetzt werden; mit der aktuellen (leeren) Implementierung ist dieses Verhalten nicht sichergestellt.\n- In `Sudoku.java` ist `main()` nicht `public static void main(String[] args)`, dadurch startet das Programm nicht wie erwartet (Standard-Java-Entry-Point).\n\n### Suggestion\n- Für `solved(model, fieldNr)`: Überlege dir eine Rekursion mit einer klaren Verankerung (z.B. “alle Felder bearbeitet”), und wie du aus `fieldNr` die Koordinaten `(i, j)` berechnest.\n- Behandle zwei Fälle getrennt: Feld ist schon belegt (direkt zum nächsten Feld) vs. Feld ist leer (Werte 1..size ausprobieren).\n- Denk daran: Nach jedem “Setzen” solltest du nur dann tiefer rekursieren, wenn der gesetzte Wert lokal gültig ist (Tipp: Checker-Methode für genau dieses Feld verwenden).\n- Wenn keiner der ausprobierten Werte zum Erfolg führt: Das Feld wieder leeren (Backtracking), sonst bleibt ein falscher Versuch im Modell stehen.\n- Für `nofSolutions(model, fieldNr, max)`: Nutze die gleiche Struktur wie beim Lösen, aber statt “found boolean” sammelst du eine Anzahl; die Verankerung liefert dann “1 Lösung”.\n- Um `MAX` einzuhalten: Sobald du schon genug Lösungen hast, solltest du die Suche abbrechen bzw. den verbleibenden “max-Rest” in rekursive Aufrufe mitgeben.\n- Für das “Modell zurücksetzen”: Achte darauf, dass jede Änderung an einem Feld, die du im Solver machst, beim Zurücklaufen wieder rückgängig gemacht wird (insbesondere bei `nofSolutions`, wo du bewusst *alle* Möglichkeiten durchläufst).\n- Für `Sudoku.java`: Vergleiche deine `main`-Signatur mit der Java-Konvention; sonst wird die GUI nie gestartet, egal wie gut dein Solver ist.\n\n### Code Style\n- In `SudokuSolverImpl` stehen noch `// TODO implement`-Platzhalter; die solltest du entfernen, sobald du die Methoden umgesetzt hast.\n- In `Sudoku.java` fehlt das `public static` bei `main`; auch wenn es “nur” eine Signatur ist, ist es für Java ein zentraler Konventions-/Lesbarkeits- und Tooling-Punkt (IDE/Runner erkennen sonst den Einstieg nicht).\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
} ]
}
}