{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec`: du rufst rekursiv mit **denselben Parametern** wieder `drawRec(g, x, y, s, n-1)` auf. Dadurch wird das gleiche Quadrat immer wieder weiter “verfeinert”, statt die Form in kleinere Bereiche aufzuteilen, und es entstehen nicht die geforderten Teil-Quadrate an unterschiedlichen Positionen.\n- In `Boxes.drawRec`: du zeichnest im Rekursionsschritt **vier** rekursive Quadrate (inkl. eins mit unverändertem `s`), wodurch das resultierende Muster nicht der gewünschten Box-Fraktal-Struktur entspricht (typischerweise wird die Fläche in Teilquadrate zerlegt und ein Teil anders behandelt/ausgelassen bzw. anders terminiert).\n\n### Suggestion\n- Überlege dir für `Boxes`, welche Parameter sich bei jedem Rekursionsschritt **ändern müssen**, damit du wirklich in **verschiedenen Quadranten** weiterzeichnest: `x`/`y` sollten je nach Quadrant verschoben werden und `s` sollte passend verkleinert werden.\n- Prüfe, ob du im Rekursionsschritt wirklich nochmal das **große** Quadrat (`s` unverändert) zeichnen/verarbeiten willst. Meistens entsteht das Muster dadurch, dass du nur in den **Teilquadraten** weiterrekursierst und ggf. ein bestimmtes Teilquadrat direkt im Basisfall zeichnest (oder gezielt nicht weiter unterteilst).\n\n### Code Style\n- In `Boxes.drawRec` und `Triangles.drawRec` sind die `return;` nach dem Basisfall nicht nötig, wenn du stattdessen ein `else` verwendest (macht den Kontrollfluss etwas klarer).\n- In `Boxes.drawRec` wäre es lesbarer, wenn du für `s/2` eine Variable (z.B. `half`) verwendest, damit die Offsets (`x + half`, `y + half`) leichter nachvollziehbar sind.\n\n\n# Exercise: knapsack\n\n### Correctness\n- Du brichst die Rekursion mit `if (i == maxN)` ab, aber `i` ist hier der **Index des Gegenstands**, nicht die Anzahl erlaubter Kopien; damit werden je nach Eingabe nicht alle Gegenstände betrachtet bzw. du kannst sogar außerhalb des Arrays landen.\n- Durch `pack(i); // try again for the same item` erlaubst du, einen Gegenstand **beliebig oft** zu nehmen (bis das Gewicht voll ist). Das verletzt die Aufgabenanforderung „nur bis maxN-mal“ pro Gegenstand.\n- Es fehlt eine korrekte Abbruch-/Auswertungsbedingung für den Fall „alle Gegenstände durchgegangen“ (typisch: wenn `i` das Ende von `weights/values` erreicht), d.h. du aktualisierst `maxValue` nicht zuverlässig nur dann, wenn alle Entscheidungen für alle Items getroffen wurden.\n\n### Suggestion\n- Überlege dir, wofür der Parameter `i` in `pack(i)` stehen soll: **Item-Index** vs. **Anzahl Kopien**. `maxN` bezieht sich auf Kopien, nicht auf die Anzahl verschiedener Items.\n- Statt „bei demselben `i` bleiben“ (unbounded) brauchst du eine Möglichkeit, für ein Item systematisch **0..maxN Kopien** zu probieren und danach erst zum nächsten Item (`i+1`) weiterzugehen.\n- Deine Stoppbedingung sollte an die **Länge der Item-Listen** gekoppelt sein (also wann alle Items entschieden sind), und erst dann `maxValue` aktualisieren (unter Berücksichtigung von `maxWeight`).\n\n### Code Style\n- Kommentar `unloadItem(i); // remove item if it was to much` ist irreführend: du entlädst nicht „wenn es zu viel war“, sondern immer nach dem rekursiven Versuch; formuliere das neutraler (Backtracking/Undo-Schritt).\n- In `KnapsackN.main()` fehlt wie in der Vorlage die übliche Java-Signatur mit `String[] args` (kann je nach Test/Runner relevant sein).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `Sudoku.java` ist `main()` nicht als `public static void main(String[] args)` deklariert, dadurch startet die Applikation nicht wie erwartet.\n- `solved(SudokuModel model)` erfüllt die Spezifikation für den Fehlerfall nicht: Wenn keine Lösung gefunden wird, muss das Model auf den Initialzustand zurückgesetzt werden (dein Code lässt die letzten Backtracking-Änderungen nicht garantiert komplett verschwinden).\n- `nofSolutions(SudokuModel model)` erfüllt die Spezifikation nicht: Nach dem Zählen muss das Model wieder im Initialzustand sein (bei dir bleibt das Sudoku je nach Verlauf evtl. verändert, v.a. durch gesetzte Werte in anderen Feldern, die nicht mehr zurückgenommen werden).\n\n### Suggestion\n- Für den Startpunkt: Vergleiche die geforderte Methodensignatur von `main` mit der Konvention, die die JVM als Einstiegspunkt sucht (Stichworte: `public`, `static`, Parameter).\n- Für das “Reset auf Initialzustand”: Überlege dir, was “Initialzustand” hier bedeutet (die vorgegebenen Zahlen sollen bleiben, nur die durch den Solver gesetzten müssen weg). Du kannst entweder (a) vor dem Lösen den Zustand sichern und bei `false` wiederherstellen oder (b) sicherstellen, dass dein Backtracking wirklich jedes von dir gesetzte Feld beim Zurücklaufen wieder löscht – auch über mehrere Rekursionsebenen hinweg.\n- Für `nofSolutions`: Achte darauf, dass beim Zählen grundsätzlich weitergesucht wird (auch nachdem eine Lösung gefunden wurde), aber dass am Ende trotzdem alle von dir gesetzten Felder wieder gelöscht sind. Prüfe dabei besonders die Stellen, an denen du früh zurückkehrst (z.B. wenn `count >= max`): auch dort muss der Zustand korrekt “aufgeräumt” sein.\n\n### Code Style\n- Du hast bereits einen `SudokuChecker checker` im Solver, nutzt ihn aber nicht (stattdessen eigene `isValid`-Logik). Das ist redundant und macht Wartung schwieriger; entscheide dich für einen Ansatz.\n- `isValid` dupliziert Logik, die es im Projekt schon gibt (`checker.oneOK`/`allOK`). Das erhöht die Wahrscheinlichkeit von Inkonsistenzen, falls sich Regeln/Validierung ändern.\n- In `nofSolutions` ist die Kombination aus “quota” (`max - count`) und zusätzlichem Early-Return gut gemeint, aber schwer zu lesen; klarere Variablennamen (z.B. “remaining”) würden Verständlichkeit deutlich erhöhen.\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" : "FAILED",
"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
} ]
}
}