{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du im rekursiven Fall alle vier Quadranten rekursiv weiter; dadurch entsteht am Ende eine komplett gefüllte 2x2/4x4/…-Unterteilung und nicht die im Template/Beispiel angedeutete „Boxes“-Fraktalform, bei der ein Teil anders behandelt wird (z.B. ein Quadrant nicht weiter rekursiv).\n- In `Triangles.drawRec` sind die drei rekursiven Aufrufe nicht die drei „Eck-Dreiecke“ des großen Dreiecks, sondern du verwendest jeweils einen Original-Eckpunkt zusammen mit zwei Mittelpunkten; dadurch entstehen Dreiecke, die nicht der geforderten Unterteilung (Sierpinski-artig) entsprechen.\n\n### Suggestion\n- Schau dir bei den Boxen an, wie viele rekursive Unterquadrate pro Ebene wirklich weiter aufgeteilt werden sollen. Überlege: Welche Quadrate sollen „weiter fraktal“ werden und welches soll nur als Quadrat gezeichnet werden, damit das typische Muster entsteht?\n- Bei den Dreiecken: Berechne zuerst konsequent die drei Mittelpunkte der Seiten (zwischen (x0,x1), (x0,x2), (x1,x2)). Verwende dann diese Mittelpunkte so, dass die drei rekursiven Dreiecke jeweils genau in einer Ecke des ursprünglichen Dreiecks liegen (jeweils ein Original-Eckpunkt + die zwei zugehörigen Seitenmittelpunkte dieser Ecke).\n\n### Code Style\n- In `Triangles.drawRec` ist das `else` nach einem `return` im `if (n == 0)` nicht nötig; du kannst den restlichen Code danach ohne `else` schreiben, das macht es lesbarer.\n- Die `return;`-Zeile im Base-Case ist funktional ok, aber nicht zwingend erforderlich, wenn du den Code entsprechend strukturierst (reduziert Sprünge im Kontrollfluss).\n\n\n# Exercise: knapsack\n\n### Correctness\n- `KnapsackN.main()` hat nicht die erwartete Java-Signatur (`main(String[] args)`), dadurch lässt sich das Programm in einer normalen Java-Umgebung nicht direkt starten (auch wenn die Tests evtl. nur `KnapsackImpl` prüfen).\n\n### Suggestion\n- Passe die `main`-Methode so an, dass sie von der JVM als Einstiegspunkt erkannt wird (achte auf Parameterliste und `static public`/`static`-Kombination).\n\n### Code Style\n- In `pack` hast du verschachtelte Schleifen zum mehrfachen Laden/Entladen; das ist zwar korrekt, aber schwerer zu lesen. Überlege dir, ob du das „k-mal laden/entladen“ an einer Stelle kapseln willst (z.B. mit einer Methode oder indem du in größeren Schritten rechnest), damit der Kontrollfluss übersichtlicher wird.\n- Der Kommentar „Item 0 bis maxN mal versuchen“ ist hilfreich, aber du könntest zusätzlich kurz festhalten, warum du bei `currWeight + k*weights[i] > maxWeight` abbrichst (macht die Intention noch klarer).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `solved(...)` setzt du beim Backtracking ein Feld mit `model.set(row, col, 0)` zurück; laut `SudokuModel`-Interface ist `0` bei `set` nicht erlaubt (zum Leeren muss `clear(i,j)` verwendet werden), sonst fliegt eine `IllegalArgumentException`.\n- In `solved(...)` wird bei “keine Lösung gefunden” das Sudoku nicht auf den Initialzustand zurückgesetzt, wie es die Spezifikation fordert (die von dir ausprobierten Werte bleiben ggf. teilweise im Model stehen, sobald eine Exception/Abbruch passiert bzw. ohne korrektes Clear).\n- In `nofSolutions(...)` setzt du ebenfalls mit `model.set(row, col, 0)` zurück; gleiche Problematik: `set(...,0)` ist verboten.\n- In `nofSolutions(...)` steht in der Aufgabenbeschreibung/JavaDoc, dass das Model am Ende wieder im Initialzustand sein muss; durch das verbotene Zurücksetzen (und fehlendes konsequentes `clear`) ist das nicht gewährleistet.\n\n### Suggestion\n- Schau dir im `SudokuModel`-Interface den Unterschied zwischen `set(...)` und `clear(...)` an und nutze zum Zurücksetzen im Backtracking immer die dafür vorgesehene Methode.\n- Überlege dir, wo genau in deinem Backtracking du “aufräumst”, wenn ein Zweig fehlschlägt (und auch wenn du wegen `max` früh abbrichst), damit das Model nach einem kompletten `solved`/`nofSolutions`-Aufruf wieder exakt dem Ausgangszustand entspricht.\n\n### Code Style\n- Du hast die Sudoku-Größe mehrfach als Magic Numbers (`81`, `9`) verdrahtet; robuster wäre es, konsequent `model.size()` (und daraus `size*size`) zu verwenden, dann funktioniert der Solver auch für andere Größen.\n- In `solved(...)` verwendest du `checker.allOK(model)` in jeder Kandidatenprüfung; das ist unnötig teuer, weil es jedes Mal das ganze Board prüft (man kann sich auf die Prüfung des gerade gesetzten Felds fokussieren).\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
} ]
}
}