{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec(...)` zeichnest du im Rekursionsfall nicht das unten-links Quadrat (bei dir werden nur 3 Teilquadrate rekursiv gezeichnet), dadurch entsteht nicht die geforderte Boxen-Fraktalstruktur.\n- In `Boxes.drawRec(...)` zeichnest du zusätzlich im Rekursionsfall immer das große äußere Rechteck (`g.drawRect(x,y,s,s)`), wodurch bei jedem Rekursionslevel “Rahmen” überlagert werden, die in der Aufgabenidee nicht dazugehören.\n- `Triangles.drawRec(...)` ist nicht implementiert, damit erfüllt deine Abgabe die Anforderung “Implementiere die beiden draw Methoden in Boxes und Triangles” nicht.\n\n### Suggestion\n- Überlege dir bei den Boxen: Welche 4 Quadranten gibt es (oben links, oben rechts, unten links, unten rechts) und welche davon sollen in welchem Rekursionsschritt gezeichnet werden? Prüfe, ob du wirklich alle benötigten Teilquadrate zeichnest.\n- Für die Boxen: Entscheide dich klar, *wann* du zeichnest: entweder nur im Basisfall (n==0) oder bewusst auch in höheren Stufen – aber dann muss das zum Muster passen. Vergleiche mental, ob ein “Rahmen um alles” pro Rekursionsstufe im Zielbild vorkommt.\n- Für die Dreiecke: Starte mit einem Basisfall, der ein einzelnes Dreieck mit drei `drawLine`-Aufrufen zeichnet. Danach berechnest du die Mittelpunkte der Dreiecksseiten und rufst die Rekursion auf den passenden 3 Teil-Dreiecken auf (achte darauf, dass die Eckpunkte richtig zugeordnet sind).\n\n### Code Style\n- In `Boxes.drawRec(...)` sind die Kommentare (rechts oben/recht unten/links oben) hilfreich, aber die Reihenfolge der Aufrufe ist etwas “durcheinander”; eine konsistente Reihenfolge (z.B. im Uhrzeigersinn) macht das leichter nachvollziehbar.\n- `Circles` ist komplett ungenutzt (wird in `Fractal` nicht zur `shapes`-Liste hinzugefügt) und zudem unimplementiert; wenn das nicht Teil deiner Abgabe ist, könnte man die Klasse weglassen oder zumindest klar kennzeichnen, dass es optional ist.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `pack(int i)` ist nicht implementiert, damit wird kein Suchraum durchsucht und `maxValue` bleibt immer `0` → die Tests können so nicht bestehen.\n- `loadItem(int i)` und `unloadItem(int i)` sind nicht implementiert, dadurch kann das „n-mal mitnehmen“ (maxN) nicht umgesetzt werden.\n- In `KnapsackN` hat `main()` nicht die übliche Signatur `main(String[] args)`; falls die Aufgabe/Tests das Programm direkt starten, wird es so ggf. nicht als Einstiegspunkt erkannt.\n\n### Suggestion\n- Überlege dir für `pack(i)` eine Rekursion/Backtracking-Struktur mit Abbruchbedingung: Was passiert, wenn `i == weights.length`? Wo aktualisierst du dann `maxValue`?\n- Damit „n-mal mitnehmen“ funktioniert: Pro Item `i` musst du nicht nur „nehmen oder nicht nehmen“ abdecken, sondern 0..maxN Kopien. Denk an eine Schleife über die Anzahl Kopien und kombiniere das mit dem rekursiven Schritt zu `i+1`.\n- Achte darauf, dass dein Zustand (`currWeight`, `currValue`) nach dem Ausprobieren eines Items wieder exakt zurückgesetzt wird (Backtracking). Wenn du `loadItem` mehrfach aufrufst, muss `unloadItem` die passende Menge wieder entfernen.\n- Prüfe die `main`-Signatur gegen das, was eure Umgebung/Tests erwarten; oft wird nur `public static void main(String[] args)` automatisch ausgeführt.\n\n### Code Style\n- Die Methoden heißen in deiner Vorlage `loadItem/unloadItem`, in vielen Lösungen/Materialien eher `packItem/unpackItem`; konsistente Benennung hilft, damit man beim Lesen sofort versteht, dass es um den Backtracking-Schritt geht.\n- In `KnapsackN` ist `main()` ohne Parameter unüblich; selbst wenn es lokal läuft, ist die Standard-Signatur für Java-Projekte wartungsfreundlicher.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und gibt immer `false` zurück; damit wird keine Lösung per Backtracking gefunden und das Board wird nie befüllt.\n- `QueensSolver.count()` ist nicht implementiert und gibt immer `0` zurück; damit wird die Anzahl möglicher Lösungen nicht gezählt.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Hilfsmethode, die zeilenweise (oder spaltenweise) versucht eine Dame zu setzen, und beim Scheitern die gesetzte Dame wieder entfernt (Backtracking). Ein Abbruchkriterium ist erreicht, wenn du für alle Zeilen eine Dame platziert hast.\n- Für `count()`: Ähnlich wie bei `solve()`, aber statt beim ersten Fund aufzuhören, sammelst du die Anzahl aller vollständigen Platzierungen. Achte darauf, nach jedem rekursiven Versuch die gesetzte Dame wieder zurückzunehmen, damit die nächsten Versuche korrekt sind.\n\n### Code Style\n- In `Queens.java` ist `main()` nicht die übliche Java-Entry-Signatur (`static void main(String[] args)`); falls das Programm so gestartet werden soll, kann das sonst dazu führen, dass es nicht ausführbar ist.\n\n\n# Exercise: sudoku\n\n### Correctness\n- `SudokuSolverImpl.solved(...)` ist nicht implementiert und gibt immer `false` zurück; damit wird nie eine Lösung gefunden und das Modell wird auch nicht wie gefordert über Backtracking gelöst.\n- `SudokuSolverImpl.nofSolutions(...)` ist nicht implementiert und gibt immer `0` zurück; damit wird die Anzahl Lösungen nie korrekt gezählt und das Modell wird nicht wie gefordert wieder in den Ausgangszustand zurückgesetzt.\n- In `Sudoku.java` ist die `main`-Methode nicht als `public static void main(String[] args)` definiert; so startet die Applikation in der Regel nicht über den Java-Entrypoint.\n\n### Suggestion\n- Für `solved`: Überlege dir eine rekursive Funktion, die ein Feld nach dem anderen (z.B. über eine laufende Feldnummer) abarbeitet. Abbruchbedingung ist erreicht, wenn du „hinter“ dem letzten Feld angekommen bist. Wenn ein Feld schon belegt ist, gehst du einfach zum nächsten weiter; sonst probierst du Werte 1..size(), prüfst nach jedem Setzen mit `checker.oneOK(...)`, und machst bei Misserfolg ein Undo (`clear`) bevor du zurückgehst.\n- Für `nofSolutions`: Nutze dieselbe Traversierung wie beim Lösen, aber statt beim ersten Fund aufzuhören, summierst du die Anzahl gefundener vollständiger Lösungen. Achte dabei darauf, dass du die Suche begrenzt (Parameter `max` / `SudokuSolver.MAX`) und dass du vor dem Zurückkehren das Feld wieder leerst, damit das Modell am Ende wieder im Startzustand ist.\n- Für `main`: Schau dir an, welche Signatur Java als Programmstart erwartet und passe die Methode entsprechend an (Zugriffsmodifizierer, `static`, Parameterliste).\n\n### Code Style\n- Die `// TODO implement`-Platzhalter sind ok während der Arbeit, sollten aber entfernt werden, sobald du die Methoden umgesetzt hast, damit klar ist, dass die Abgabe vollständig ist.\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
} ]
}
}