{
"llm" : {
"feedback" : "Exercise: fractal\n\n1. Correctness\n- In `Boxes` ist `drawRec(...)` noch nicht implementiert, dadurch werden keine rekursiven Boxen gezeichnet.\n- In `Triangles` ist `drawRec(...)` noch nicht implementiert, dadurch werden keine rekursiven Dreiecke gezeichnet.\n\n2. Suggestion\n- Überlege dir für beide Shapes zuerst den Rekursionsabbruch: Was soll bei `n == 0` passieren, und wann wird mindestens ein Rechteck/Dreieck gezeichnet?\n- `Boxes`: Zeichne im aktuellen Rekursionsschritt zuerst das Rechteck mit den aktuellen Parametern (`x`, `y`, `s`) und rufe danach `drawRec` für die kleineren Teil-Quadrate/Boxen auf (mit angepassten Koordinaten und kleinerer Seitenlänge, und `n-1`).\n- `Triangles`: Zeichne zuerst das Dreieck über die drei Kanten (3 Linien). Für die Rekursion: Berechne aus den drei Eckpunkten die Mittelpunkte der Kanten und rufe `drawRec` auf den entstehenden kleineren Dreiecken mit `n-1` auf.\n\n3. Code Style\n- In `Shape` ist `public` bei Interface-Methoden redundant (kann weggelassen werden), weil sie implizit `public` sind.\n\n\nExercise: knapsack\n\n1. Correctness\n- In `KnapsackImpl` sind `pack`, `packItem` und `unpackItem` nicht implementiert; damit liefert `solve()` immer `0` und die mitgelieferten Tests können nicht bestehen.\n- Die Anforderung „jeden Gegenstand bis zu n‑mal mitnehmen“ ist aktuell nirgends umgesetzt (kein Zähler/keine Schleife, die die Mehrfachauswahl pro Item berücksichtigt).\n\n2. Suggestion\n- Starte bei `pack(i)` mit einem rekursiven/Backtracking-Ansatz ähnlich wie beim 0/1‑Knapsack, aber erweitere die Entscheidung pro Item von „0 oder 1“ auf „0 bis maxN“ Wiederholungen: also pro Index `i` mehrere Fälle durchprobieren und jeweils weiter zu `i+1`.\n- Achte darauf, dass du das aktuelle Gewicht/den aktuellen Wert beim „Einpacken“ erhöhst und beim Zurückgehen („Backtracking“) wieder exakt auf den vorherigen Zustand zurücksetzt; sonst „schleppen“ spätere Rekursionszweige falsche Zustände mit.\n- Prüfe an der richtigen Stelle, ob `currWeight <= maxWeight` gilt, und aktualisiere `maxValue` nur dann, wenn du eine vollständige Auswahl (z.B. am Ende der Item-Liste) erreicht hast und der Wert besser ist als bisher.\n\n3. Code Style\n- Die TODO-Kommentare sind ok als Platzhalter, aber aktuell bleibt dadurch wesentliche Logik unimplemented; sobald du implementierst, ersetze sie durch sprechende Kommentare nur dort, wo der Code nicht selbsterklärend ist.\n- Überlege, ob du in `pack` frühzeitig abbrichst (Guard Clauses), um Verschachtelungen gering zu halten und die Lesbarkeit zu verbessern.\n\n\nExercise: queens\n\n1. Correctness\n- `solve()` ist nicht implementiert und liefert immer `false`, damit wird nie ein Board gelöst/gefüllt.\n- `count()` ist nicht implementiert und liefert immer `0`, damit 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) eine Dame setzt, mit `checkPlacement(...)` prüft, bei Erfolg zur nächsten Zeile geht und bei Misserfolg die gesetzte Dame wieder entfernt (Backtracking). Abbruchbedingung ist erreicht, wenn alle Zeilen platziert sind.\n- Für `count()`: Ähnlich wie bei `solve()`, aber statt beim ersten Fund abzubrechen, sammelst du alle vollständigen Platzierungen. Achte darauf, dass du nach jeder rekursiven Erkundung den gesetzten Zug wieder rückgängig machst, sonst „verschmutzt“ das Board für weitere Möglichkeiten.\n\n3. Code Style\n- In `BoardPrinter.printLine`: `if (board[row][col] == true)` ist unnötig ausführlich; ein direkter Boolean-Check ist lesbarer.\n\n\nExercise: sudoku\n\n1. Correctness\n- In `SudokuSolverImpl` ist `solved(...)` nicht implementiert und liefert immer `false`; damit wird nie ein Sudoku gelöst und das Modell bleibt unverändert.\n- In `SudokuSolverImpl` ist `nofSolutions(...)` nicht implementiert und liefert immer `0`; damit wird die Anzahl Lösungen nie korrekt gezählt.\n- Die Anforderung „bei `solved`: falls keine Lösung gefunden, Modell auf Initialzustand zurücksetzen“ wird aktuell nicht erfüllt (es passiert weder ein Versuch zu lösen noch ein Reset nach Fehlschlag).\n- Die Anforderung „bei `nofSolutions`: Modell am Ende auf Initialzustand zurücksetzen“ wird aktuell nicht erfüllt.\n\n2. Suggestion\n- Für `solved(model, fieldNr)`: Überlege dir eine Rekursions-/Abbruchbedingung, die „alle Felder abgearbeitet“ erkennt (z.B. wenn `fieldNr` die Anzahl Felder erreicht). Ab da gibst du „gelöst“ zurück.\n- Nutze `fieldNr`, um aus einer linearen Feldnummer `(i, j)` zu berechnen (Index-Umrechnung) und entscheide dann: ist das Feld schon belegt (`get(i,j) != 0`) → zum nächsten Feld; sonst Werte ausprobieren.\n- Beim Ausprobieren: Setze einen Kandidatenwert, prüfe die Gültigkeit der partiellen Lösung mit dem `checker` (typisch `oneOK` für das gesetzte Feld), und gehe nur dann rekursiv weiter; wenn es nicht klappt, Feld wieder leeren (Backtracking).\n- Für den Reset beim Scheitern von `solved`: Du brauchst eine Möglichkeit, den ursprünglichen Zustand der Eingabe zu bewahren (z.B. vorher sichern oder beim Backtracking alle gemachten Änderungen zurücknehmen, bevor du `false` nach außen gibst).\n- Für `nofSolutions(model, fieldNr, max)`: Denk ähnlich wie beim Lösen, aber statt beim ersten Treffer abzubrechen, zählst du Treffer. Sobald du `max` erreicht hast, solltest du frühzeitig abbrechen.\n- Achte darauf, dass `nofSolutions` nach dem Zählen den Zustand wieder vollständig zurücksetzt (egal ob 0, 1 oder viele Lösungen gefunden wurden). Das klappt am einfachsten, wenn jedes gesetzte Feld im selben Rekursionsschritt auch wieder geleert wird, bevor du zurückkehrst.\n\n3. Code Style\n- Die `// TODO implement`-Stellen sind stehen geblieben; entweder implementieren oder zumindest klar markieren, welche Schritte noch fehlen (z.B. mit kurzen Kommentaren zur geplanten Logik).\n- In der Abgabe ist sehr viel unverändertes Template-/Boilerplate-Code enthalten; üblich wäre, nur die tatsächlich geänderten Dateien/Teile hervorzuheben oder einzureichen (falls euer Workflow das erlaubt).\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>"
} ]
}
}