{
"llm" : {
"feedback" : "Exercise: fractal\n\n1. Correctness\n- Du hast die beiden geforderten `draw`-Implementationen noch nicht umgesetzt: In `Boxes.drawRec(...)` und `Triangles.drawRec(...)` steht weiterhin nur `// TODO implement`, damit werden keine Formen gezeichnet und die Aufgabenanforderung (“Implementiere die beiden draw methoden…”) ist nicht erfüllt.\n\n2. Suggestion\n- In `Boxes.drawRec(...)`: Überlege dir eine Abbruchbedingung für die Rekursion (z.B. abhängig von `n`), zeichne dann das aktuelle Rechteck mit `g.drawRect(...)` und rufe die Methode anschließend rekursiv für kleinere/verschobene Teil-Rechtecke auf.\n- In `Triangles.drawRec(...)`: Zeichne zuerst das aktuelle Dreieck, indem du die drei Kanten mit `g.drawLine(...)` verbindest, und berechne danach für den rekursiven Schritt die Punkte der kleineren Dreiecke (typisch über Mittelpunkte der Seiten) und rufe `drawRec(...)` mit `n-1` für diese Teil-Dreiecke auf; auch hier brauchst du eine klare Abbruchbedingung.\n\n3. Code Style\n- Die TODO-Kommentare sind ok als Platzhalter, aber sobald du implementierst, entferne/ersetze sie durch kurze Kommentare, die den Rekursionsschritt und die Abbruchbedingung erklären (das hilft beim Debuggen).\n- In `Fractal.main` ist eine zusätzliche Leerzeile vor der schließenden Klammer; nicht schlimm, aber halte die Formatierung konsistent.\n\n\nExercise: knapsack\n\n1. Correctness\n- `pack(int i)` ist nicht implementiert; damit wird keine Suche nach einer optimalen Kombination durchgeführt und `solve()` liefert immer den Initialwert.\n- `packItem(int i)` ist nicht implementiert; dadurch können weder Gewicht noch Wert beim “Einpacken” angepasst werden.\n- `unpackItem(int i)` ist nicht implementiert; dadurch kann ein zuvor gepackter Zustand nicht sauber zurückgesetzt werden (wichtig für Backtracking).\n- Die Anforderung “Gegenstände n‑Mal mitnehmen können (bis maxN)” wird aktuell nirgends umgesetzt.\n\n2. Suggestion\n- Überlege dir für `pack(i)` eine rekursive/iterative Entscheidung pro Item-Typ: einmal den Fall “0 Stück von Item i” und zusätzlich die Fälle “1 bis maxN Stück von Item i”, jeweils mit einem rekursiven Aufruf für `i+1`.\n- Achte darauf, wann du `maxValue` aktualisierst: typischerweise dann, wenn du alle Item-Typen betrachtet hast (Basisfall) und das aktuelle Gewicht noch innerhalb `maxWeight` liegt.\n- `packItem(i)` sollte den aktuellen Zustand (Gewicht/Wert) genau um *ein* Stück des Items verändern; die “n Stück”-Logik gehört dann in die Schleife in `pack(i)`.\n- Für `unpackItem(i)` brauchst du eine konsistente Rücknahme dessen, was du in der Schleife insgesamt eingepackt hast (Backtracking). Überlege, ob du am Ende pro Item-Typ alles wieder entfernst, was du bis zu `maxN`-mal hinzugefügt hast, oder ob du nach jedem Hinzufügen wieder einzeln zurücknimmst.\n\n3. Code Style\n- Die `// TODO implement`-Platzhalter sind noch drin; sobald du implementierst, entferne sie oder ersetze sie durch sinnvolle Kommentare (z.B. zur Rekursionsidee/Basisfall).\n- Optional zur Lesbarkeit: Dokumentiere kurz die Bedeutung von `i` (Index des aktuell betrachteten Gegenstands-Typs) und die Invarianten von `currWeight/currValue` während der Rekursion.\n\n\nExercise: queens\n\n1. Correctness\n- `solve()` ist nicht implementiert und liefert immer `false`, dadurch wird keine Lösung gesucht/gesetzt und es wird nie ein Board ausgegeben.\n- `count()` ist nicht implementiert und liefert immer `0`, dadurch wird die Anzahl Lösungen nicht gezählt.\n\n2. Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise (oder spaltenweise) versucht, eine Dame zu platzieren, und bei einem Konflikt wieder zurücknimmt (Feld auf `false` setzen) und die nächste Spalte ausprobiert. Wenn du die letzte Zeile erfolgreich platzierst, kannst du `true` zurückgeben.\n- Nutze `checkPlacement(row, col)` genau in dem Moment, bevor du eine Dame auf `board[row][col] = true` setzt.\n- Für `count()`: Verwende eine sehr ähnliche Backtracking-Struktur wie bei `solve()`, aber statt beim ersten Treffer abzubrechen, zählst du jede vollständige Platzierung als 1 und summierst alle Möglichkeiten über alle Spalten-Entscheidungen.\n- Achte darauf, dass `count()` den Board-Zustand nach jedem Versuch wieder sauber zurücksetzt, sonst beeinflussen frühere Platzierungen spätere Zählungen.\n\n3. Code Style\n- Die `// TODO implement` Kommentare sind ok während der Bearbeitung, aber sobald du implementierst, entferne sie oder ersetze sie durch kurze, erklärende Kommentare zur Backtracking-Idee (z.B. „try columns in this row“).\n\n\nExercise: sudoku\n\n1. Correctness\n- In `SudokuSolverImpl`, the required backtracking logic is not implemented: `solved(model, int fieldNr)` always returns `false`, so `solved(...)` can never report a found solution.\n- `nofSolutions(model, int fieldNr, int max)` always returns `0`, so solution counting will never work.\n- The requirement “false: no solution found, model was reset to its initial state” is currently not fulfilled, because there is no logic that restores the model to its original configuration when no solution exists (or after counting solutions).\n\n2. Suggestion\n- For `solved(...)`: Think about how to map `fieldNr` (0..size*size-1) to `(i,j)` coordinates, and how to advance to the next field. If the current field is already filled, you typically skip it and recurse to the next one.\n- For `solved(...)`: For an empty field, try values `1..size()` and use `checker.oneOK(model, i, j)` (or equivalent) after setting a candidate to decide whether to continue recursively; if it fails, undo that move (clear the cell) before trying the next value.\n- For the “reset to initial state” requirement: Consider storing enough information before you start (e.g., which cells were initially empty vs. given), so you can undo all changes if the search fails (and also after counting solutions).\n- For `nofSolutions(...)`: Reuse the same recursion structure as in `solved`, but instead of stopping at the first found solution, accumulate a count. Also incorporate the `max` parameter so the recursion can stop early once the count reaches `MAX`.\n- For `nofSolutions(...)`: Make sure that after exploring a value in a cell you always backtrack (clear it) before returning, otherwise later branches will be counted with a “dirty” board.\n\n3. Code Style\n- Large parts of the submission are unchanged template/framework code; for an exercise submission it’s usually better to only include the file(s) you modified (here: `SudokuSolverImpl.java`) to keep the diff focused.\n- The `// TODO implement` markers are still present; once you implement the methods, remove or replace them with meaningful comments about the algorithm (optional, but improves readability).\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>"
} ]
}
}