{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec`: Du zeichnest im Rekursionsfall (`n > 0`) zusätzlich das grosse Rechteck und rufst dann nur 3 von 4 Teilquadraten rekursiv auf; dadurch fehlt ein Quadrant (unten links) in der rekursiven Struktur und das Muster entspricht nicht der geforderten rekursiven Boxen-Form.\n- In `Triangles.drawRec`: Im Rekursionsfall (`n > 0`) zeichnest du das aktuelle (grosse) Dreieck erneut; bei der rekursiven Dreiecksform ist aber typischerweise nur im Basisfall das Zeichnen der Dreiecks-Kanten vorgesehen, während der Rekursionsfall nur weiter unterteilt.\n- In `Triangles.drawRec`: Die drei rekursiven Aufrufe verwenden nicht die “drei Eck-Dreiecke” (oben, unten links, unten rechts) auf Basis der Seitenmittelpunkte in der passenden Punktkombination; mindestens eines deiner Teil-Dreiecke nutzt eine andere Punktekombination (u.a. wird `xUnten,yUnten` als erster Punkt verwendet), wodurch die rekursive Geometrie nicht wie erwartet weitergeführt wird.\n\n### Suggestion\n- Boxes: Überlege dir, welche 4 Sub-Quadrate bei einer Halbierung von `s` entstehen (oben links, oben rechts, unten links, unten rechts) und stelle sicher, dass du für alle vier Bereiche entweder rekursiv weitergehst oder (falls gewollt) gezielt nur im Basisfall zeichnest.\n- Boxes: Prüfe, ob du im Rekursionsfall wirklich das “aktuelle” Quadrat zeichnen willst, oder ob das Zeichnen nur dann passieren soll, wenn du nicht weiter unterteilst (Basisfall).\n- Triangles: Trenne klar zwischen “Geometrie berechnen und rekursiv aufrufen” (Rekursionsfall) und “Linien tatsächlich zeichnen” (Basisfall). Das verhindert doppelte/überlagerte Linien.\n- Triangles: Berechne die drei Seitenmittelpunkte am besten direkt als Mittelwert der jeweiligen Endpunkte (z.B. zwischen (x0,y0)-(x1,y1) usw.) und nutze dann für die 3 rekursiven Aufrufe jeweils die richtigen 3 Eckpunkte pro Teil-Dreieck (oben: Spitze + zwei obere Mittelpunkte; unten links: linker Eckpunkt + zwei passende Mittelpunkte; unten rechts analog). Kontrolliere die Zuordnung, indem du dir die Punkte auf ein Blatt skizzierst.\n\n### Code Style\n- In `Triangles.drawRec` sind die Inline-Kommentare bei `g.drawLine(...)` irreführend (die genannten Zahlen passen nicht zu den jeweiligen Parametern) und machen das Nachvollziehen schwer; entweder korrigieren oder entfernen.\n- Die Berechnung der Mittelpunkte in `Triangles` ist unnötig kompliziert mit `Math.abs(...) / 2 + Math.min(...)`; ein konsistenterer Ausdruck verbessert Lesbarkeit und reduziert Fehlerquellen.\n- In beiden Klassen zeichnest du im Rekursionsfall zusätzlich Linien/Rechtecke; selbst wenn es “irgendwie” funktioniert, macht das den Code schwerer zu verstehen und erzeugt viele redundante Zeichenoperationen.\n\n\n# Exercise: knapsack\n\n### Correctness\n- Du berücksichtigst `maxN` aktuell nicht: Dein `pack` entscheidet pro Item nur zwischen „0x“ oder „1x“ mitnehmen, aber die Aufgabe verlangt, dass jedes Item bis zu `n`-mal gewählt werden kann.\n- In `pack` prüfst du die Gewichtsbeschränkung (`currWeight <= maxWeight`) erst im Blattfall (`i == weights.length`). Dadurch werden auch Zustände weiter verfolgt, die das Maximalgewicht bereits überschritten haben, statt sie frühzeitig abzubrechen (die Tests erwarten typischerweise das korrekte (und ggf. effizientere) Suchverhalten für diese Variante).\n\n### Suggestion\n- Überlege dir, wie du die Entscheidung „wie oft nehme ich Item i mit?“ ausdrücken kannst: statt nur zwei rekursiven Fällen (nicht nehmen / einmal nehmen) brauchst du für jedes Item eine Auswahl aus mehreren Möglichkeiten (z.B. 0..`maxN`).\n- Wenn du ein Item mehrfach „lädst“, achte darauf, dass du beim „Entladen“ wieder genau auf den vorherigen Zustand zurückkommst (also nicht nur einmal abziehen, wenn du es mehrfach addiert hast).\n- Baue eine Abbruchbedingung ein, die sofort zurückkehrt, sobald `currWeight` bereits größer als `maxWeight` ist, damit ungültige Teilzustände nicht weiter rekursiv ausgebaut werden.\n\n### Code Style\n- `maxN` ist deklariert und wird nie verwendet; entweder nutzen oder entfernen (aktuell deutet es auf eine unvollständige Umsetzung hin).\n- In `KnapsackN` ist `main()` ohne `String[] args`; je nach Test-/Startumgebung kann das problematisch sein (üblich ist die Standard-Signatur).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl.solved(...)` ist keine Backtracking-Logik implementiert und die Methode gibt aktuell immer `false` zurück, dadurch wird nie ein Sudoku gelöst.\n- In `SudokuSolverImpl.nofSolutions(...)` ist keine Zähl-Logik implementiert und die Methode gibt aktuell immer `0` zurück, dadurch wird die Anzahl Lösungen nie korrekt bestimmt.\n- In `Sudoku.java` ist `main()` nicht als Java-Entry-Point definiert (es fehlt `public static void main(String[] args)`), dadurch startet die Applikation so nicht wie erwartet.\n\n### Suggestion\n- Für `solved(...)`: Überlege dir eine Rekursion über alle Felder (z.B. über eine laufende Feldnummer). Als Abbruchbedingung dient typischerweise „alle Felder abgearbeitet/gefüllt“. Bei vorgegebenen Feldern gehst du einfach weiter, bei leeren probierst du nacheinander mögliche Werte und prüfst nach jedem Setzen mit dem `checker`, ob der aktuelle Zustand noch gültig ist.\n- Für `nofSolutions(...)`: Das ist sehr ähnlich zu `solved(...)`, aber statt beim ersten Treffer aufzuhören, sammelst du die Treffer als Zahl. Denk daran, dass du bei jedem gefundenen vollständigen Sudoku `1` zurückgeben kannst und diese Werte „hochaddierst“. Nutze außerdem den `max`-Parameter, um frühzeitig abzubrechen, sobald genug Lösungen gefunden wurden.\n- Für `Sudoku.java`: Schau dir an, welche Signatur Java zum Starten erwartet und passe die `main`-Methode entsprechend an, damit die GUI überhaupt gestartet werden kann.\n\n### Code Style\n- Unnötiger Import in `SudokuSolverImpl`: `java.util.HashSet` wird nicht verwendet und sollte entfernt werden.\n- Die TODO-Kommentare („Was soll diese Methode machen?? ...“) sind verständlich als Notiz, aber im finalen Abgabezustand besser durch kurze, zielgerichtete Kommentare ersetzen (z.B. „Backtracking über fieldNr“ / „Zähle Lösungen mit Branch-and-bound über max“).\n\n\n# Exercise: queens\n\nLlm Evaluation ist für diese Aufgabe deaktiviert. Entferne die .llmignore Datei vom Package der Aufgabe.\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: <174>"
}, {
"name" : "random2()",
"status" : "FAILED",
"message" : "expected: <340> but was: <279>"
}, {
"name" : "random3()",
"status" : "FAILED",
"message" : "expected: <558> but was: <357>"
}, {
"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
} ]
}
}