{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` ist der rekursive Fall falsch: Du zeichnest (indirekt) kein Muster aus 4 Teil-Quadraten, sondern machst am Ende noch einen rekursiven Aufruf mit derselben Größe `s` (`drawRec(g, x, y, s, n-1)`), was nicht dem geforderten Aufteilen in kleinere Quadrate entspricht.\n- In `Boxes.drawRec` fehlt der Teil unten links in der korrekten Größe/Position (bei dir wird stattdessen einmal mit voller Größe weiterrekursiert).\n- `Triangles.drawRec` ist nicht implementiert, obwohl die Aufgabe verlangt, beide `draw`-Methoden in `Boxes` und `Triangles` zu implementieren.\n\n### Suggestion\n- Überlege dir im rekursiven Fall bei `Boxes`, wie viele Teilquadrate gezeichnet werden sollen und welche Koordinaten/Seitenlängen diese haben müssen (Hinweis: alle Kind-Quadrate sollten dieselbe, kleinere Seitenlänge haben und ihre Positionen ergeben sich durch Verschiebung um `s/2` in x/y).\n- Prüfe bei `Boxes`, ob jeder rekursive Aufruf die Größe wirklich reduziert; wenn ein Aufruf mit derselben Größe `s` weiterläuft, erzeugt das ein anderes Bild als “Quadrat in 4 Quadrate teilen”.\n- Für `Triangles`: Setze zuerst einen klaren Abbruchfall (z.B. `n == 0`), in dem du genau drei Linien zeichnest. Im rekursiven Fall brauchst du dann aus den drei Eckpunkten die Mittelpunkte der Kanten, um die Teil-Dreiecke zu definieren.\n\n### Code Style\n- Entferne die `// TODO implement`-Kommentare dort, wo du bereits Code geschrieben hast, oder ersetze sie durch eine passendere Erklärung.\n- In `Boxes.drawRec` wären kurze Kommentare zu “welches Teilquadrat wird hier gezeichnet?” hilfreich, weil die vier Aufrufe sehr ähnlich aussehen und sonst leicht vertauscht werden.\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()` keine optimale Lösung berechnen und die Tests werden nicht bestehen.\n- In `KnapsackN` hat `main()` nicht die übliche Java-Signatur `main(String[] args)`; je nach Test-/Run-Setup wird das Programm so nicht als Startpunkt erkannt.\n\n### Suggestion\n- Überlege dir für `pack(i)` die Rekursions-/Backtracking-Struktur: Was ist der Abbruchfall (alle Items betrachtet), und wann aktualisierst du `maxValue`? Achte darauf, dass du nur Lösungen mit `currWeight <= maxWeight` bewertest.\n- Um „n-mal mitnehmen“ umzusetzen, brauchst du pro Gegenstand nicht nur die Entscheidung „nehmen/nicht nehmen“, sondern eine Schleife über die Anzahl (z.B. 0 bis maxN). Prüfe dabei, wie du zwischen den Rekursionsaufrufen `currWeight/currValue` korrekt veränderst und danach wieder zurücksetzt (Backtracking).\n- Für `loadItem/unloadItem`: Stelle sicher, dass `unloadItem` exakt den Effekt der vorherigen `loadItem`-Aufrufe rückgängig macht (insbesondere wenn du ein Item mehrfach lädst). Sonst „schleppt“ der Zustand in andere Äste der Rekursion.\n- Passe die `main`-Signatur so an, dass sie sicher vom Runner gefunden wird (falls das bei euch Teil der automatischen Tests/Execution ist).\n\n### Code Style\n- Die Methoden heißen in deiner Version `loadItem/unloadItem`, während die Bedeutung eher „pack/unpack“ ist; ein konsistentes Naming (auch zur Aufgabenstellung) macht es leichter, die Backtracking-Logik korrekt zu halten.\n- In `KnapsackN` fehlt `String[] args` bei `main`; auch wenn es nicht immer gefordert ist, ist das der übliche Java-Standard und vermeidet Verwirrung beim Ausführen.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, dadurch wird nie ein Board gelöst/gefüllt.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, dadurch wird die Anzahl Lösungen nicht gezählt.\n- In `Queens` ist `main()` nicht als Java-Entry-Point definiert (es fehlt die übliche `static`-Signatur mit `String[] args`), dadurch startet das Programm so nicht wie vorgesehen.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise vorgeht: Basisfall „alle Reihen verarbeitet“ und sonst in der aktuellen Reihe jede Spalte ausprobieren, mit `checkPlacement(...)` prüfen, setzen, rekursiv weiter, und beim Fehlschlag wieder zurücksetzen.\n- Für `count()`: Sehr ähnlich wie `solve()`, aber statt beim ersten Fund abzubrechen, summierst du die Anzahl vollständiger Lösungen; auch hier nach jedem rekursiven Versuch wieder „undo“ (Queen entfernen).\n- Für `main()`: Vergleiche die Methodensignatur mit dem, was Java als Einstiegspunkt akzeptiert, damit dein Code tatsächlich ausgeführt werden kann.\n\n### Code Style\n- In `getBoard()` ist `return this.board;` zwar ok, aber `this.` ist hier nicht nötig; konsistent entweder überall verwenden oder weglassen.\n- Die `// TODO implement`-Kommentare sind ok während der Arbeit, sollten aber nach dem Implementieren entfernt werden.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, die Methoden `solved(model, fieldNr)` und `nofSolutions(model, fieldNr, max)` sind nicht implementiert und liefern immer `false` bzw. `0`, damit wird weder gelöst noch gezählt (Anforderung 2 und 4 nicht erfüllt).\n- `Sudoku.java` hat keine korrekte Java-Entry-Point-Signatur: `void main()` statt `public static void main(String[] args)`, dadurch startet die Applikation typischerweise nicht über den üblichen Java-Startmechanismus.\n\n### Suggestion\n- Für `solved(...)`: Überlege dir eine Backtracking-Rekursion mit einer klaren Verankerung (“alle Felder abgearbeitet”) und einem Schritt, der das aktuelle Feld entweder überspringt (wenn vorgegeben) oder Werte ausprobiert und bei Fehlschlag wieder zurücksetzt (clear).\n- Für `nofSolutions(...)`: Nutze dieselbe Traversierungslogik wie beim Lösen, aber statt beim ersten Fund abzubrechen, zählst du Lösungen auf. Denk daran, dass du beim Rekursionsaufruf das verbleibende `max` (bzw. “Budget”) reduzieren kannst, damit du spätestens bei `MAX` stopst.\n- Für `Sudoku.java`: Schau dir an, welche Signatur Java als Startpunkt erwartet und passe `main` entsprechend an (Zugriffsmodifier + `static` + Parameterliste).\n\n### Code Style\n- Lass die `// TODO implement`-Platzhalter nicht im finalen Stand stehen, wenn du die Methoden implementiert hast; ersetze sie durch sinnvolle Kommentare (z.B. “Verankerung”, “Rekursionsschritt”), damit man die Backtracking-Struktur schnell erkennt.\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
} ]
}
}