{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Triangles`, die rekursive `drawRec(...)`-Methode ist nicht implementiert; damit wird die Dreiecks-Fraktalform gar nicht gezeichnet, obwohl die Aufgabe explizit die Implementierung in `Triangles` verlangt.\n- In `Boxes` zeichnest du im Rekursionsschritt alle vier Quadranten rekursiv mit `n-1`; dadurch entsteht eine vollständige 2x2-Unterteilung auf jeder Ebene (4^n Kästchen) und nicht die Form, bei der ein Teil (unten links) nicht weiter rekursiv verfeinert wird.\n\n### Suggestion\n- Für `Triangles`: Überlege dir eine klare Abbruchbedingung (z.B. `n == 0`), in der du genau die drei Kanten eines Dreiecks zeichnest. Für den Rekursionsfall: Bestimme die drei Mittelpunkte der Dreiecksseiten (jeweils Durchschnitt der Endpunkte) und rufe dann die Rekursion für die entstehenden kleineren Dreiecke auf.\n- Für `Boxes`: Schau dir an, welche Teilquadrate bei jedem Schritt weiter unterteilt werden sollen und welche nicht. Ein hilfreicher Ansatz ist: bei `n > 0` nur für bestimmte Quadranten mit `n-1` weitergehen und für den “nicht weiter zu verfeinernden” Quadranten direkt ein Quadrat zeichnen (oder mit `n=0` aufrufen).\n\n### Code Style\n- In `Boxes.drawRec` steht noch ein `// TODO implement`-Kommentar, obwohl du es bereits implementiert hast; den kannst du entfernen.\n- Die Kommentare `//rechts oben`, `//recht unten` etc. sind ok, aber achte auf konsistente Schreibweise (z.B. “rechts” vs. “recht”), damit es leichter lesbar bleibt.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `pack(int i)` ist nicht implementiert; damit wird nie eine Lösung gesucht und `solve()` liefert immer `0`, unabhängig von Eingaben.\n- `loadItem(int i)` und `unloadItem(int i)` sind nicht implementiert; damit kann das „n-mal mitnehmen“ (bis `maxN`) nicht umgesetzt werden.\n- `KnapsackN.main()` hat die falsche Signatur (`static void main()` statt `static void main(String[] args)`); so startet das Programm als Java-Application typischerweise nicht, was das Testen erschwert.\n\n### Suggestion\n- In `pack(i)` brauchst du eine Rekursion/Backtracking-Logik, die für jedes Item systematisch alle erlaubten Anzahlen durchprobiert (0 bis `maxN`) und dann zum nächsten Index weitergeht.\n- Achte in der Rekursion auf einen klaren Abbruchfall: entweder „alle Items betrachtet“ (dann ggf. `maxValue` aktualisieren) oder „Gewicht überschritten“ (dann diesen Pfad abbrechen).\n- `loadItem(i)` sollte beim Hinzufügen eines Gegenstands den aktuellen Zustand (`currWeight`, `currValue`) verändern; `unloadItem(i)` muss den Zustand wieder exakt zurücksetzen, passend dazu, wie oft du in der Schleife geladen hast.\n- Passe die `main`-Methode auf die übliche JVM-Signatur an, damit du lokal und in vielen Testumgebungen sicher ausführen kannst.\n\n### Code Style\n- Die Methoden sind als `TODO implement` leer; wenn du sie schrittweise entwickelst, ist es oft hilfreich, mindestens eine minimale Struktur (z.B. Abbruchbedingungen/Kommentare zum Ablauf) einzubauen, damit klar ist, welche Fälle du abdeckst.\n- Benennungen sind grundsätzlich ok, aber `loadItem/unloadItem` sollten semantisch konsistent sein (z.B. „pack/unpack“ oder „load/unload“) und in der Logik dann auch genau das tun.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, damit wird keine Lösung gesucht/gesetzt.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl der Lösungen nicht gezählt.\n- In `Queens` ist die `main`-Methode nicht als Java-Entry-Point definiert (`static void main(String[] args)` fehlt), dadurch startet das Programm typischerweise nicht wie gefordert.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise arbeitet: in einer Zeile alle Spalten testen, bei gültiger Platzierung die Dame setzen, dann zur nächsten Zeile gehen, und bei Misserfolg die Dame wieder entfernen.\n- Für `count()`: Ähnlich wie `solve()`, aber statt beim ersten Fund zu stoppen, sammelst du die Anzahl kompletter Platzierungen; der Rückgabewert aus rekursiven Aufrufen wird dabei aufsummiert.\n- Für `main`: Prüfe die genaue Methodensignatur, die Java als Startpunkt erwartet (statisch, mit `String[] args`), und passe deine Methode daran an.\n\n### Code Style\n- In `getBoard()` ist `return this.board;` ok, aber im restlichen Code verwendest du `board` ohne `this`—einheitlich bleiben (entweder immer oder nie `this` bei Feldern, solange nichts überschattet wird).\n- Die `// TODO implement`-Kommentare sind ok während der Arbeit, sollten aber nach der Implementierung entfernt werden.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, `solved(SudokuModel model, int fieldNr)` is not implemented and always returns `false`, so the Sudoku will never be solved.\n- In `SudokuSolverImpl`, `nofSolutions(SudokuModel model, int fieldNr, int max)` is not implemented and always returns `0`, so counting solutions will always claim there are no solutions.\n- In `Sudoku.java`, the entry point is not a valid Java `main` method (`void main()` instead of `public static void main(String[] args)`), so the application won’t start when run normally.\n\n### Suggestion\n- For `solved(...)`: think in terms of backtracking with a recursion index (`fieldNr`) that walks through all 81 fields; define a clear base case for “all fields processed”, and for each empty field try values `1..size()` and only recurse further if the checker says the placement is valid; if no value works, undo the placement before returning.\n- For `nofSolutions(...)`: reuse the same traversal idea as in `solved(...)`, but instead of stopping at the first solution, accumulate a counter; also make sure you respect the `max` limit by stopping the search once the count reaches it, and undo any trial placements when backtracking.\n- For `Sudoku.java`: adjust the signature of the entry method to the standard Java entry point so the GUI can be launched by the runtime.\n\n### Code Style\n- Remove the `// TODO implement` placeholders once you implement the methods; they become noise afterward.\n- Consider adding brief comments for your recursion/base case/backtracking steps (especially in `nofSolutions`) so it’s easier to verify that you always “set → check → recurse → clear” consistently.\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" : "Connection refused to host: 172.25.0.6; nested exception is: \n\tjava.net.ConnectException: Connection refused"
}, {
"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
} ]
}
}