{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec`, du zeichnest im Rekursionsfall alle vier Teil-Quadrate rekursiv weiter; dadurch entsteht nicht das geforderte Fraktal-Muster (das eine Teilquadrat bleibt auf der aktuellen Stufe „voll“/wird nicht weiter unterteilt, sondern nur als Quadrat gezeichnet).\n- In `Triangles`, die rekursive Zeichenlogik ist noch nicht implementiert; damit wird die Dreiecksform/fraktale Struktur gar nicht gezeichnet.\n\n### Suggestion\n- Schau dir bei `Boxes` an, welche der vier Quadranten in der Zielfigur „weiter zerfällt“ und welcher Quadrant auf jeder Stufe nur als einfaches Quadrat stehen bleibt; genau dieser eine sollte nicht mit `n-1` weiter rekursiv aufgeteilt werden.\n- Für `Triangles`: Überlege dir zuerst den Basisfall (`n == 0`): da musst du genau die drei Kanten mit `g.drawLine(...)` zeichnen. Für den Rekursionsfall (`n > 0`) brauchst du dann aus den drei Eckpunkten die Mittelpunkte der drei Seiten und rufst die Rekursion nur auf den passenden Teil-Dreiecken auf (nicht auf dem mittleren „Loch“).\n\n### Code Style\n- Die Kommentar-Beschriftung beim letzten `Boxes`-Rekursionsaufruf ist widersprüchlich (`y + s/2` ist unten links, der Kommentar sagt „rechts unten“); benenne/kommentiere die Quadranten konsistent, damit du Logikfehler schneller erkennst.\n- In `Boxes.drawRec` könntest du die wiederholten Ausdrücke wie `s / 2` und `x + s / 2` in lokale Variablen legen, um Lesbarkeit und Fehlersuche zu verbessern.\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 Maximalwert berechnen und die Tests werden nicht bestehen.\n\n### Suggestion\n- Implementiere in `pack(i)` eine Rekursion/Backtracking-Logik mit Abbruchbedingung (wenn `i` alle Items durchlaufen hat) und einer Aktualisierung von `maxValue`, sobald eine gültige Kombination (Gewicht ≤ `maxWeight`) besser ist als das bisherige Maximum.\n- Denke daran, dass du jedes Item nicht nur „0 oder 1 Mal“, sondern von „0 bis `maxN` Mal“ wählen können musst: innerhalb des Schritts für ein Item bietet sich eine Schleife über die Anzahl Kopien an, mit jeweils passendem „laden“ und am Ende wieder „entladen“ (Rückgängigmachen der Zustandsänderung).\n- Achte darauf, dass dein Entladen die zuvor geladene Anzahl wirklich vollständig rückgängig macht, damit nach dem Zurückkehren aus der Rekursion der Zustand (`currWeight`, `currValue`) wieder exakt ist wie davor.\n\n### Code Style\n- Die Methoden heißen in deinem Entwurf `loadItem`/`unloadItem`, im Beispiel wird eher `packItem`/`unpackItem` verwendet; wähle konsistente, zur restlichen Logik passende Namen (wichtig ist vor allem, dass „load/unload“ eindeutig als Zustandsänderung im Backtracking erkennbar ist).\n- In `KnapsackN` ist `static void main()` nicht die übliche Java-Signatur für einen Startpunkt (`main(String[] args)`); falls es dafür keine spezielle Vorgabe in eurer Umgebung gibt, ist das verwirrend und kann das manuelle Ausführen erschweren.\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 das Board wird nie korrekt 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 `main()` nicht als Einstiegspunkt nutzbar (nicht `static`, keine `String[] args`), dadurch startet das Programm in Java-Umgebungen typischerweise nicht wie gefordert.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Methode, die zeilenweise vorgeht: Basisfall „alle Zeilen verarbeitet“; sonst in der aktuellen Zeile jede Spalte testen, bei gültiger Position setzen, rekursiv weiter, und bei Fehlschlag wieder zurücksetzen (Backtracking).\n- Für `count()`: Sehr ähnlich zu `solve()`, aber statt beim ersten Fund aufzuhören, addierst du die Anzahl Lösungen aus allen rekursiven Pfaden; Basisfall liefert dann „1 Lösung gefunden“ statt `true/false`.\n- Für `main()`: Schau dir an, wie eine Java-`main`-Methode signiert sein muss, damit die Klasse ausführbar ist (statisch und mit Argument-Array).\n\n### Code Style\n- Die `// TODO implement`-Platzhalter sind ok während der Arbeit, aber sobald du implementierst, sollten sie entfernt oder durch passende Kommentare ersetzt werden.\n- `getBoard()` gibt `this.board` zurück; `this.` ist hier nicht nötig (kein Fehler, aber unnötig).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, die Methoden `solved(SudokuModel model, int fieldNr)` und `nofSolutions(SudokuModel model, int fieldNr, int max)` sind nicht implementiert und liefern aktuell immer `false` bzw. `0`; damit wird das Sudoku nie gelöst und die Anzahl Lösungen wird nie korrekt gezählt.\n- In `Sudoku.java` ist `main()` nicht `public static void main(String[] args)`, dadurch startet die Applikation in einer normalen Java-Umgebung nicht wie erwartet (Entry-Point fehlt).\n\n### Suggestion\n- Für `solved(...)`: Überlege dir eine Rekursion mit Backtracking über eine lineare Feldnummer (z.B. `fieldNr` von 0 bis `size()*size()-1`), berechne daraus `(i, j)`, überspringe vorgegebene Felder (`get(i,j) != 0`), und probiere sonst Werte `1..size()` mit einem Konflikt-Check (z.B. `checker.oneOK(...)`). Wenn ein Versuch scheitert, musst du das Feld wieder leeren (Backtracking).\n- Für `nofSolutions(...)`: Denk an die gleiche Traversierung wie beim Lösen, aber statt beim ersten Fund zu stoppen, summierst du die Anzahl gefundener vollständiger Lösungen auf. Nutze `max`/`MAX` als Abbruchbedingung, damit du nicht endlos suchst (z.B. bei sehr vielen Lösungen).\n- Für `Sudoku.java`: Schau dir an, welche Methodensignatur Java als Startpunkt erwartet, und passe die Sichtbarkeit (`public`), `static`, sowie das `String[] args` entsprechend an.\n\n### Code Style\n- Die `// TODO implement`-Stellen sind ok als Marker, aber solange sie drin sind und konstante Rückgabewerte liefern, wirkt das wie “Stub-Code”; besser erst committen, wenn zumindest ein lauffähiger Grundalgorithmus steht.\n- In `Sudoku.java` fehlt auch die `@Override`-Problematik nicht, aber die abweichende `main`-Signatur ist ein klarer Wartbarkeits-/Nutzbarkeitskiller: halte dich bei Entry-Points strikt an das Standard-Java-Pattern.\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
} ]
}
}