{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du bei `n > 0` alle vier Quadranten rekursiv weiter; bei der geforderten Boxen-Form bleibt unten links auf der aktuellen Ebene „einfach ein Quadrat“ (nicht weiter rekursiv), sonst entsteht ein vollständig gefülltes 2^n×2^n Raster statt der vorgesehenen Fraktal-Struktur.\n- In `Fractal.main` fehlt `new Circles()` in der `shapes`-Liste; falls die Aufgabe verlangt, alle vorhandenen Shapes (inkl. Circles/challenge) über `d` umschalten zu können, ist das so nicht erfüllt.\n\n### Suggestion\n- Schau dir bei den Boxen an, welcher Teil **nicht** weiter unterteilt werden soll: Du brauchst drei rekursive Aufrufe mit `n-1` und für den verbleibenden Quadranten entweder direkt einen `drawRect(...)`-Aufruf oder einen rekursiven Aufruf, der garantiert im Basisfall endet (z.B. mit einem „kleinen“ `n`).\n- Wenn du die Kreise (oder generell alle Shape-Klassen) über die UI erreichbar machen willst, ergänze die entsprechende Instanz in die `shapes`-Liste und prüfe dann, ob das Umschalten mit `d` wirklich durch alle Formen iteriert.\n\n### Code Style\n- In `Triangles.drawRec` ist das `else` nach `return` redundant (nach einem `return` läuft der Code ohnehin nicht weiter); das kann man vereinfachen, um die Methode leichter lesbar zu halten.\n- In `Triangles.drawRec` berechnest du viele Mittelpunkte direkt inline in den Argumenten; das macht die Aufrufe schwer zu lesen und fehleranfälliger. Besser ist, die drei Mittelpunkte einmal in gut benannten Variablen zu speichern und dann in den drei rekursiven Aufrufen zu verwenden.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `KnapsackN.main()` hat nicht die übliche Signatur `main(String[] args)`. Je nach Test-Setup wird dein Programm dadurch nicht gestartet bzw. die Tests, die `main` erwarten, schlagen fehl.\n\n### Suggestion\n- Schau dir an, wie Java Programme typischerweise als Entry Point gestartet werden, und passe die Methodensignatur von `main` entsprechend an (Parameterliste und ggf. `public`).\n\n### Code Style\n- Du hast sowohl `if (currWeight > maxWeight) return;` am Anfang als auch später in der Schleife eine zusätzliche Gewichtsprüfung mit `break`. Das ist okay, aber etwas redundant – überlege, ob du eine der beiden Prüfungen klarer strukturieren willst, damit man leichter sieht, welche Abbrüche wo passieren.\n- Die Kommentare sind hilfreich, aber teils redundant zum Code (z.B. “k-mal laden/entladen”). Kürzere oder präzisere Kommentare (warum, nicht was) wären lesbarer.\n\n\n# Exercise: sudoku\n\n### Correctness\n- `nofSolutions(SudokuModel model)` verwendet `Integer.MAX_VALUE` statt die vorgegebene Schranke `SudokuSolver.MAX`; damit wird die Anforderung verletzt, nach `MAX` Lösungen abbrechen zu dürfen/sollen.\n- `nofSolutions(...)` setzt das Modell am Ende nicht garantiert auf den Initialzustand zurück: Wenn du vorzeitig per `return count;` abbrichst (bei `count >= max`), bleiben die Felder der tieferen Rekursionsebenen ggf. belegt.\n- `solved(...)` setzt das Modell bei “keine Lösung gefunden” nicht auf den Initialzustand zurück, wie es im Interface-Vertrag steht (am Ende können Einträge aus gescheiterten Rekursionszweigen übrig bleiben).\n\n### Suggestion\n- Schau dir an, welche Konstante im Interface explizit für das Limit genannt ist, und überlege, wie du sie in `nofSolutions(model)` als Startwert an deine Rekursion weitergibst.\n- Für das “Modell zurücksetzen” hilft es, genau zu prüfen, auf welcher Ebene du ein Feld setzt und wo du es wieder leeren musst: Wenn du in einer Ebene ein Feld setzt, sollte diese Ebene auch sicherstellen, dass dieses Feld vor jedem Rücksprung/Return wieder geleert ist (auch beim “early exit” wegen `max`).\n- Bei `solved(...)`: Überlege, was passieren soll, wenn ein Kandidat in tieferen Ebenen scheitert. Reicht es, nur das aktuelle Feld zu clearen, oder musst du sicherstellen, dass beim Fehlschlag der gesamte Suchpfad sauber zurückgebaut wird, bevor `false` nach oben propagiert wird?\n\n### Code Style\n- In `SudokuSolverImpl.nofSolutions(...)` ist der Parametername `max` etwas verwirrend, weil du ihn teils als “Restbudget” (`max - count`) verwendest; ein klarerer Name würde die Logik leichter nachvollziehbar machen.\n- Die Kommentare wie `// ← korrektes Zurücksetzen` sind okay, aber sie lenken etwas ab; besser wäre ein kurzer Kommentar *warum* an der Stelle gecleart wird (Backtracking/Restore), nicht *dass* es passiert.\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" : "PASSED",
"message" : null
}, {
"name" : "random2()",
"status" : "PASSED",
"message" : null
}, {
"name" : "random3()",
"status" : "PASSED",
"message" : null
}, {
"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
} ]
}
}