{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes`, die rekursive Zeichenlogik (`drawRec`) ist nicht implementiert, dadurch werden keine Boxen gezeichnet.\n- In `Triangles`, die rekursive Zeichenlogik (`drawRec`) ist nicht implementiert, dadurch werden keine Dreiecke gezeichnet.\n\n### Suggestion\n- Für `Boxes`: Überlege dir eine Abbruchbedingung für `n` (z.B. wann wirklich ein Rechteck gezeichnet wird) und was im rekursiven Fall passieren soll (wie du das Quadrat in kleinere Teilquadrate aufteilst und welche davon du weiter rekursiv zeichnest).\n- Für `Triangles`: Definiere ebenfalls einen Basisfall (bei dem du mit `g.drawLine(...)` die drei Kanten zeichnest) und berechne im rekursiven Schritt die Mittelpunkte der Dreiecksseiten, damit du daraus die kleineren Teildreiecke für den nächsten Rekursionsschritt aufrufen kannst.\n\n### Code Style\n- In `Boxes.drawRec` und `Triangles.drawRec` stehen noch `// TODO`-Kommentare ohne Implementierung; entferne sie erst, wenn du fertig bist, oder ersetze sie durch kurze Kommentare, die den Rekursionsschritt/Basisfall erklären.\n\n\n# Exercise: knapsack\n\nLlm Evaluation ist für diese Aufgabe deaktiviert. Entferne die .llmignore Datei vom Package der Aufgabe.\n\n\n# Exercise: sudoku\n\n### Correctness\n- `Sudoku.main()` hat nicht die Java-Startsignatur (`public static void main(String[] args)`); so startet die Applikation nicht wie vorgesehen.\n- `solved(...)` liefert aktuell praktisch immer `false`, auch wenn eine Lösung gefunden würde (Return-Value/Weiterreichen des rekursiven Ergebnisses fehlt).\n- Dein `solved(...)`-Backtracking erfüllt die Anforderung „bei keiner Lösung: Modell auf Initialzustand zurücksetzen“ nicht (du setzt nur punktuell, aber stellst das ganze Sudoku bei Fehlschlag nicht wieder her).\n- In `solved(...)` behandelst du vorgegebene Felder nicht korrekt: du prüfst/änderst auch bereits gefüllte Felder, statt sie einfach zu überspringen.\n- In `solved(...)` fehlt das eigentliche Backtracking-Verhalten: wenn ein Feld keinen gültigen Wert zulässt, musst du zur vorherigen Zelle zurückgehen und dort den nächsten Wert probieren; dein Code geht immer nur vorwärts (`fieldNr + 1`), ohne korrekt zurückzuspringen.\n- Du verwendest feste `9` für Zeile/Spalte (`fieldNr / 9`, `% 9`) statt `model.size()`, obwohl das Interface allgemein gehalten ist.\n- `nofSolutions(...)` ist nicht implementiert und gibt immer `0` zurück, verletzt damit die Aufgabenanforderung (Lösungen zählen, dabei bei MAX abschneiden und Modell zurücksetzen).\n\n### Suggestion\n- Schau dir an, wie du das Ergebnis des rekursiven Aufrufs in `solved(...)` nutzt: Wenn der Rekursionsschritt `true` liefert, solltest du diesen Erfolg nach oben „durchreichen“, statt danach noch pauschal `false` zurückzugeben.\n- Überlege dir für `solved(...)` eine klare Verankerung: „alle Felder abgearbeitet“ → dann ist eine Lösung gefunden (ohne am Ende nochmal global `allOK` zu prüfen, wenn du schon bei jedem Setzen lokal prüfst).\n- Für Backtracking brauchst du zwei Fälle pro Feld: (1) Feld ist vorgegeben → direkt zum nächsten Feld; (2) Feld ist leer → alle Kandidaten probieren, bei Fehlschlag Feld wieder leeren und `false` zurückgeben, damit die vorherige Ebene weiterprobiert.\n- Achte darauf, dass du bei einem Fehlschlag nicht nur den aktuellen Wert erhöhst, sondern wirklich „ausprobieren → rekursiv weiter → wenn nicht erfolgreich, nächster Wert“. Das ist einfacher als „wenn ungültig, erhöhe“ innerhalb desselben Feldes, weil du sonst leicht in Zustände kommst, die nie zurückgerollt werden.\n- Ersetze die fest codierte `9` durch `model.size()` (und ggf. `model.size() * model.size()` für die Feldanzahl), damit deine Indizierung zur Modellgröße passt.\n- Für `nofSolutions(...)`: Denke an dieselbe Rekursionsstruktur wie beim Lösen, aber statt `true/false` addierst du die Anzahl gefundener Lösungen. Das `max`-Argument hilft dir dabei, früh abzubrechen (z.B. sobald du schon `max` erreicht hast).\n- Für das „Modell zurücksetzen“ bei `nofSolutions(...)`: Stelle sicher, dass jedes Feld, das du im Suchprozess setzt, vor dem Zurückkehren wieder geleert wird (egal ob du Lösungen gefunden hast oder nicht).\n\n### Code Style\n- In `solved(...)` sind unnötige `this.`-Qualifizierungen (`this.checker...`) verwendet; das macht den Code schwerer zu lesen, ohne Mehrwert.\n- Die Kontrollflussstruktur in `solved(...)` ist aktuell schwer nachvollziehbar (verschachtelte `if/else` + danach immer Rekursion); versuche die Fälle (vorgegeben/leer, Erfolg/Fehlschlag) klarer zu trennen, damit man die Backtracking-Logik direkt lesen kann.\n- Magische Zahl `9` im Solver: selbst wenn hier immer 9x9 verwendet wird, ist `model.size()` die passendere, selbstdokumentierende Variante.\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: <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
} ]
}
}