{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Triangles.drawRec` zeichnest du im Basisfall (`n == 0`) die dritte Kante als `g.drawLine(x0, y0, x2, y2)`; das ist nicht die Kante zwischen Punkt 2 und Punkt 0 (die fehlt), sondern du zeichnest damit die Kante 0–2 ein zweites Mal statt 2–0 bzw. 2–0 entspricht zwar geometrisch derselben Kante, aber du lässt die Verbindung `x2,y2 -> x0,y0` nicht explizit als „dritte Seite“ (du hast 0–1, 1–2 und 0–2 statt 2–0; je nach Erwartung kann das als falsches Dreieck interpretiert werden, weil die „Rundum“-Kanten nicht konsistent sind).\n- In der rekursiven Verfeinerung bei `Triangles` nutzt du beim zweiten und dritten rekursiven Aufruf feste `y1`-Werte für die Mittelpunkte auf der Basis (`(x1 + x2) / 2, y1`). Das ist nur korrekt, wenn die Basis wirklich exakt horizontal ist (gleiches `y1` und `y2`) und du immer genau diesen Punkt triffst. Wenn sich die Eckpunkte ändern (z.B. durch andere Startwerte/Fenstergrössen), ist der Mittelpunkt zwischen `(x1,y1)` und `(x2,y2)` nicht allgemein `( (x1+x2)/2, y1 )`.\n\n### Suggestion\n- Schau dir im Basisfall an, welche drei Strecken ein Dreieck wirklich braucht: Verbinde die Punkte zyklisch (0→1, 1→2, 2→0). Prüfe, ob du genau diese drei Kanten zeichnest.\n- Für die Rekursion: Berechne die drei Mittelpunkte jeweils als Mittelwert der beiden Endpunkte der entsprechenden Seite (für x **und** y), nicht nur für x. Überlege dir: „Mittelpunkt von A(xa,ya) und B(xb,yb)“ – welche Formel gilt für beide Koordinaten?\n\n### Code Style\n- In `Triangles.drawRec` sind die Ausdrücke für Mittelpunkte mehrfach direkt in die Methodenaufrufe geschrieben. Das macht das Lesen und Debuggen schwer; speichere die berechneten Mittelpunkte in gut benannten Variablen (wie du es bei `Boxes` schon halbwegs übersichtlich machst).\n- In `Boxes.drawRec` sind „magic comments“ wie `//rechts oben` ok, aber noch klarer wäre eine konsistente Reihenfolge (z.B. immer TL, TR, BR, BL) und passende Variablennamen/Struktur, damit man die Geometrie ohne Kommentare versteht.\n\n\n# Exercise: knapsack\n\n### Correctness\n\n\n### Suggestion\n\n\n### Code Style\n- In `loadItem`/`unloadItem` kannst du die verkürzten Operatoren (`+=` / `-=`) verwenden, das macht die Intention klarer.\n- Die Variable `loadeditems` ist verständlich, aber benenne sie konsistent nach Java-Konventionen (z.B. `loadedItems` in camelCase).\n- In `pack` ist die Verschachtelung (mehrere `if/else` + zwei `for`-Schleifen) etwas schwer zu lesen; eine leichte Umstrukturierung (z.B. Guard-Clauses/early return) würde die Lesbarkeit verbessern.\n\n\n# Exercise: queens\n\n### Correctness\n- In `QueensSolver.solve()` ist keine Backtracking-Lösung implementiert; die Methode liefert immer `false` und erfüllt damit die Anforderung nicht, eine Lösung zu finden (falls vorhanden).\n- In `QueensSolver.count()` ist keine Zähl-Logik implementiert; die Methode liefert immer `0` und erfüllt damit die Anforderung nicht, die Anzahl aller Lösungen zu zählen.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Methode, die zeilenweise vorgeht: in einer Zeile jede Spalte ausprobieren, bei gültiger Platzierung die Dame setzen, dann zur nächsten Zeile weitergehen; wenn es später scheitert, die gesetzte Dame wieder entfernen (Backtracking). Ein sinnvoller Abbruchfall ist erreicht, wenn du „alle Zeilen verarbeitet“ hast.\n- Für `count()`: Nutze dieselbe Struktur wie beim Lösen, aber statt beim ersten Fund abzubrechen, zählst du alle vollständigen Platzierungen. Wichtig ist auch hier, dass du nach dem rekursiven Aufruf das Board wieder in den vorherigen Zustand zurücksetzt, sonst stimmen spätere Zählungen nicht.\n\n### Code Style\n- In `Queens.java` ist `main()` nicht als Java-Entry-Point deklariert (`static void main(String[] args)` fehlt). Das ist zwar nicht Teil der QueensSolver-Aufgabe, kann aber verhindern, dass du dein Programm überhaupt starten/testen kannst.\n\n\n# Exercise: sudoku\n\n### Correctness\n- `Sudoku.main` hat nicht die korrekte Signatur als Einstiegspunkt (muss `public static void main(String[] args)` sein), sonst startet die Applikation/GUI nicht.\n- In `SudokuSolverImpl.solved(...)` ist die Abbruchbedingung falsch: bei `fieldNr == size*size` ist man fertig; mit `>` läufst du bei `fieldNr == size*size` noch in die `get(i,j)`-Berechnung und riskierst Out-of-Bounds.\n- `solved(...)` gibt aktuell immer `false` zurück, auch wenn eine Lösung gefunden wurde (das Ergebnis der Rekursion wird nicht zurückpropagiert).\n- Beim Backtracking in `solved(...)` wird ein gesetzter Wert nicht zuverlässig wieder entfernt, wenn ein rekursiver Versuch später scheitert (du löschst nur im `else`-Fall von `oneOK`, nicht nach einem erfolglosen rekursiven Aufruf).\n- `nofSolutions(...)` ist nicht implementiert und liefert immer `0`, erfüllt die Anforderung (Lösungen zählen, bis MAX) nicht.\n\n### Suggestion\n- Schau dir beim `main` die Java-Konvention für den Programmeinstieg an: die JVM sucht exakt nach einer bestimmten Methodensignatur.\n- Setz die Verankerung im Solver so, dass sie greift **bevor** du `i` und `j` aus `fieldNr` berechnest; und verwende „gleich viele Felder verarbeitet“ als Kriterium.\n- Speichere das Resultat des rekursiven Aufrufs (z.B. in einer Variable) und brich die Suche ab, sobald `true` zurückkommt; dann gib dieses Resultat auch zurück.\n- Beim Backtracking: wenn ein gesetzter Kandidat nicht zu einer Lösung führt, musst du das Feld wieder leeren, bevor du den nächsten Kandidaten probierst (nicht nur wenn `oneOK` direkt fehlschlägt).\n- Für `nofSolutions`: denk wie beim Solver, nur dass du statt „gefunden ja/nein“ die Anzahl addierst; und nutze `max` als verbleibendes Budget, damit du frühzeitig stoppen kannst, sobald du `MAX` erreicht hast.\n\n### Code Style\n- In `solved(...)` ist die Reihenfolge etwas unglücklich: du berechnest `i/j` bevor klar ist, dass `fieldNr` überhaupt gültig ist; das erschwert das Lesen und begünstigt Indexfehler.\n- In der Schleife nutzt du `k` als Kandidatenwert; ein sprechenderer Name (z.B. `val`) macht das Backtracking leichter nachvollziehbar.\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
} ]
}
}