{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec(...)` ist der Abbruchfall auf `n == 1` gesetzt; im Rahmen der App kann `n` aber auch `0` werden (Taste `s`), dann wird nie gezeichnet.\n- In `Boxes.drawRec(...)` zeichnest du im rekursiven Schritt nur 3 Teil-Quadrate; die Form ist dadurch unvollständig (ein Quadrant fehlt).\n- In `Triangles.drawRec(...)` ist der Abbruchfall auf `n == 1` gesetzt; auch hier kann `n` in der App `0` werden, dann wird nie gezeichnet.\n- In `Triangles.drawRec(...)` sind die 3 rekursiven Dreiecke nicht die drei „Ecken“-Dreiecke des Ausgangsdreiecks: eines deiner rekursiven Dreiecke nutzt Punkte, die nicht zusammen eine Ecke bilden, dadurch entsteht nicht die gewünschte rekursive Dreiecksstruktur.\n\n### Suggestion\n- Überlege dir, welches `n` in der `Fractal`-Schleife als kleinster Wert vorkommt, und wähle deinen Basisfall so, dass bei genau diesem Wert tatsächlich gezeichnet wird.\n- Beim Boxen-Fraktal: zeichne/rekrusiere konsequent alle Teilquadrate, die zu deiner Zielstruktur gehören. Prüfe die vier Quadranten (oben-links, oben-rechts, unten-links, unten-rechts) und vergleiche, welcher bei dir nie aufgerufen wird.\n- Beim Dreiecks-Fraktal: berechne die drei Mittelpunkte der Seiten (das machst du schon) und stelle dann sicher, dass die drei rekursiven Aufrufe jeweils ein Dreieck bilden, das aus **einem Original-Eckpunkt** plus den **beiden anliegenden Seitenmittelpunkten** besteht.\n- Kontrolliere die Punktkombinationen in deinen drei `drawRec`-Aufrufen: Wenn ein rekursives Dreieck keinen Original-Eckpunkt enthält (oder zwei Mittelpunkte nimmt, die nicht an derselben Ecke liegen), ist es sehr wahrscheinlich „das falsche“ Teil-Dreieck.\n\n### Code Style\n- Die Basisfälle `n == 1` sind bei beiden Formen inkonsistent zur restlichen Steuerung (wo `n` bis 0 gehen kann); selbst wenn du es korrekt machst, ist es lesbarer, wenn die Bedeutung von `n` (Tiefe/Iterationen) klar und einheitlich ist.\n- In `Fractal.java` hast du Startwerte (`n = 8`, `currShape = 1`) geändert; ist nicht falsch, aber macht das Verhalten schwerer mit der Vorlage/Tests zu vergleichen.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `pack(int i)` ist nicht implementiert, dadurch wird nie eine Kombination ausprobiert und `solve()` liefert immer `0`.\n- `loadItem(int i)` und `unloadItem(int i)` sind nicht implementiert, damit kann das “n-mal mitnehmen” (maxN) nicht umgesetzt werden.\n- In `KnapsackN` hat `main()` keine Parameter (`String[] args`); so wird das Programm je nach Test/Runner nicht als Startmethode erkannt.\n\n### Suggestion\n- Überlege dir für `pack(i)` eine Rekursion/Iteration über die Gegenstände: bei jedem Index `i` musst du alle möglichen Anzahlen dieses Items durchprobieren (inkl. 0 bis maxN) und dann mit `i+1` weitermachen.\n- Achte beim Backtracking darauf, dass du nach dem Ausprobieren eines Items den Zustand (`currWeight`, `currValue`) wieder korrekt zurücksetzt, bevor du andere Varianten testest; dafür sind `loadItem`/`unloadItem` gedacht.\n- Der beste Wert (`maxValue`) sollte nur dann aktualisiert werden, wenn du entweder am Ende der Liste angekommen bist oder keine weiteren Entscheidungen mehr möglich sind, und nur wenn das Gewicht innerhalb `maxWeight` liegt.\n- Prüfe, ob dein Test-Setup erwartet, dass `main` die Standard-Signatur `main(String[] args)` hat.\n\n### Code Style\n- Die TODO-Methoden sind leere Platzhalter; sobald du die Logik implementierst, benenne konsistent (z.B. entweder überall `load/unload` oder überall `pack/unpack`) und halte die Begriffe deckungsgleich mit dem, was sie wirklich tun (einmal laden vs. mehrfach laden bis maxN).\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, damit wird nie eine Lösung gefunden/platziert.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl Lösungen nie korrekt gezählt.\n\n### Suggestion\n- Für `solve()`: Du brauchst eine Backtracking-/rekursive Suche, die Reihe für Reihe eine Dame setzt, nur wenn `checkPlacement(row, col)` erlaubt ist; wenn du in einer tieferen Reihe scheiterst, musst du die gesetzte Dame wieder entfernen (zurücksetzen) und die nächste Spalte probieren.\n- Für `count()`: Ähnlich wie bei `solve()`, aber statt beim ersten Fund abzubrechen musst du alle gültigen Platzierungen weiterverfolgen und am Ende die Anzahl vollständiger Belegungen aufsummieren; achte auch hier darauf, nach dem rekursiven Aufruf das Feld wieder zu “entmarkieren”.\n\n### Code Style\n- In `Queens.java` ist `main()` nicht als Java-Entry-Point deklariert (`static void main(String[] args)` fehlt); so startet das Programm in der Regel nicht über die JVM-Standardkonvention.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl.solved(SudokuModel model, int fieldNr)` ist noch kein Backtracking implementiert und die Methode liefert immer `false`; damit wird kein Sudoku gelöst und das Modell wird auch nie mit einer Lösung gefüllt.\n- In `SudokuSolverImpl.nofSolutions(SudokuModel model, int fieldNr, int max)` ist noch keine Zähl-Logik implementiert und die Methode liefert immer `0`; damit wird die Anzahl Lösungen nicht gezählt und das Modell wird nicht wie gefordert am Schluss wieder auf den Ausgangszustand zurückgesetzt.\n- In `Sudoku.java` ist die `main`-Methode nicht als `public static void main(String[] args)` deklariert; so startet die Applikation in der üblichen Java-Ausführung nicht.\n\n### Suggestion\n- Für `solved(...)`: Überlege dir eine Rekursions-Verankerung (wann sind “alle Felder” abgearbeitet?) und wie du aus `fieldNr` die Koordinaten `(i, j)` berechnest. Danach brauchst du zwei Fälle: Feld ist schon belegt → zum nächsten Feld; Feld ist leer → Werte 1..size() ausprobieren, mit `checker.oneOK(...)` prüfen, rekursiv weitergehen, und bei Misserfolg das Feld wieder leeren.\n- Für `nofSolutions(...)`: Struktur ist sehr ähnlich zu `solved`, aber statt beim ersten Fund aufzuhören, sammelst du Zählerstände. Achte darauf, dass du das `max`-Limit wirklich als Abbruchkriterium nutzt (z.B. sobald du genug Lösungen gefunden hast) und dass du beim Zurückkehren aus der Rekursion die gemachten Einträge wieder entfernst (Reset des Felds), damit das Modell am Ende wieder wie zu Beginn ist.\n- Für `Sudoku.java`: Prüfe die Java-Signatur, die der JVM als Einstiegspunkt dient, und passe die Methodendeklaration entsprechend an.\n\n### Code Style\n- In `SudokuSolverImpl` stehen noch `// TODO implement`-Platzhalter; sobald du implementierst, entferne die TODOs oder ersetze sie durch kurze, inhaltliche Kommentare (z.B. “Base case”, “Try candidates”, “Backtrack”), damit die Logik leichter nachvollziehbar bleibt.\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
} ]
}
}