{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- **Boxes:** Für `n == 0` wird gar kein Rechteck gezeichnet (deine Methode zeichnet nur, wenn `n != 0`). Damit fehlt der Basisfall, und bei `n=0` bleibt die Zeichnung leer.\n- **Boxes:** In der Rekursion zeichnest du nur 3 Teil-Quadrate (oben links, oben rechts, unten rechts). Das unten-linke Teilquadrat fehlt, dadurch entsteht nicht die geforderte Box-Struktur.\n- **Triangles:** Für `n == 0` wird kein Dreieck gezeichnet (du zeichnest nur, wenn `n > 0`). Auch hier fehlt der Basisfall, daher ist bei `n=0` die Zeichnung leer.\n- **Triangles:** Du zeichnest das Dreieck in jedem Rekursionsschritt erneut, statt nur im Basisfall. Dadurch wird nicht die geforderte rekursive Fraktalstruktur umgesetzt (bei der typischerweise nur die kleinsten Dreiecke gezeichnet werden).\n\n### Suggestion\n- **Boxes (Basisfall):** Überlege dir eine Abbruchbedingung, bei der du *genau dann* ein Rechteck zeichnest, wenn die Rekursion nicht weiter heruntergeht (z.B. wenn `n` den kleinsten Wert erreicht).\n- **Boxes (4. Quadrat):** Schau dir an, welche `(x,y)`-Koordinaten das fehlende unten-linke Quadrat haben müsste, wenn `s` halbiert wird. Es ist die Kombination aus „links“ bei `x` und „unten“ bei `y`.\n- **Triangles (Basisfall):** Setze das Zeichnen der drei Kanten in den Fall, in dem nicht weiter rekursiv geteilt wird, damit `n=0` ein einzelnes Dreieck ergibt.\n- **Triangles (Rekursion):** Bestimme zuerst die drei Mittelpunkte der Seiten (zwischen den jeweiligen Eckpunkten) und rufe dann rekursiv für die drei Außendreiecke auf. Achte darauf, dass die drei rekursiven Dreiecke exakt diese Mittelpunkte als neue Ecken verwenden.\n\n### Code Style\n- In `Boxes.drawRec` ist die Logik einfacher nachvollziehbar, wenn du explizit mit einem klaren Basisfall (`if (...) { zeichnen } else { rekursiv }`) arbeitest statt „nur wenn `n != 0`“.\n- In `Triangles.drawRec` werden die Mittelpunkt-Berechnungen direkt in die Parameter geschrieben; das macht es schwer zu debuggen. Lesbarer wäre es, die berechneten Punkte in gut benannten Variablen zu speichern (z.B. `mx01`, `my01`, …).\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(...)` entlädst du am Ende immer genau `maxN`-mal (`for (int j = 1; j <= maxN; j++)`), auch wenn du das Item evtl. weniger als `maxN`-mal geladen hast. Dadurch kann `currWeight`/`currValue` negativ werden und die Zustände für nachfolgende Rekursionszweige stimmen nicht mehr.\n- Durch das Problem oben kann auch `maxValue` falsch werden, weil du Zustände vergleichst, die gar nicht einem gültigen Packzustand entsprechen.\n\n### Suggestion\n- Merke dir beim Laden, wie oft du ein Item in diesem Rekursionszweig tatsächlich hinzugefügt hast (z.B. Zähler), und mache beim “Zurückrollen” genau diese Anzahl Schritte rückgängig – nicht pauschal `maxN`.\n- Alternativ: Statt `unloadItem` in einer Schleife aufzurufen, könntest du den “Unpack”-Schritt so gestalten, dass er den gesamten Effekt der vorherigen `k` Ladevorgänge in einem Schritt rückgängig macht (wobei `k` eben die tatsächlich geladene Anzahl ist).\n\n### Code Style\n- Die Parameter `n` und `maxN` in `pack(int i, int n, int maxN)` sind verwirrend: `maxN` existiert bereits als Feld, und `n` wird nur als lokaler Schleifenzähler verwendet. Das macht die Signatur unnötig kompliziert.\n- `while (n <= maxN)` ist funktional ok, aber ein `for`-Loop würde hier klarer ausdrücken, dass es um “0..maxN-mal” geht.\n- In `solve()` startest du mit `pack(0, 1, maxN)`: Der Startwert `1` ist nicht selbsterklärend (warum nicht `0`?), was das Lesen erschwert.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `Sudoku.java` ist `main()` nicht als `public static void main(String[] args)` deklariert. So wird das Programm nicht als Java-Startklasse laufen (der GUI-Start wird nicht gefunden).\n- In `solved(...)` und `nofSolutions(...)` verwendest du feste Grenzen (`fieldNr > 80`) sowie feste Umrechnung mit `9` (`i = fieldNr / 9`, `j = fieldNr % 9`). Laut Interface soll der Solver über `model.size()` funktionieren (auch wenn hier konkret 9×9 verwendet wird).\n- `nofSolutions(...)` setzt das Model nicht zuverlässig auf den Initialzustand zurück, wenn du wegen `solutions >= max` frühzeitig mit `return max;` aus der Schleife aussteigst (das aktuell gesetzte Feld bleibt dann gesetzt). Die Spezifikation verlangt aber: “The model was reset to its initial state.”\n\n### Suggestion\n- Schau dir die Java-Signatur an, die eine Klasse haben muss, damit sie von der JVM gestartet werden kann (Stichwort: Einstiegspunkt). Vergleiche sie mit deiner `main()`-Methode.\n- Überlege dir, wie du `fieldNr` allgemeiner gegen “Ende des Feldes” prüfst und wie du `i`/`j` aus `fieldNr` berechnest, ohne irgendwo `9` oder `80` zu hardcoden. Du hast dafür bereits alles Nötige im `model` (Größe).\n- Beim Begrenzen der Lösungssuche (`MAX`): Achte darauf, dass du beim “frühen Abbrechen” trotzdem alle von dir gesetzten Werte wieder entfernst, bevor du zurückkehrst. Prüfe insbesondere die Rückgabestelle innerhalb der Guess-Schleife: Wird dort noch aufgeräumt (clear) oder springst du vorher raus?\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" : "PASSED",
"message" : null
}, {
"name" : "random2()",
"status" : "PASSED",
"message" : null
}, {
"name" : "random3()",
"status" : "PASSED",
"message" : null
}, {
"name" : "boardIsValidAfterSolveN4()",
"status" : "PASSED",
"message" : null
}, {
"name" : "boardIsValidAfterSolveN5()",
"status" : "PASSED",
"message" : null
}, {
"name" : "boardIsValidAfterSolveN8()",
"status" : "PASSED",
"message" : null
}, {
"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" : "PASSED",
"message" : null
}, {
"name" : "solveReturnsTrueForN4()",
"status" : "PASSED",
"message" : null
}, {
"name" : "solveReturnsTrueForN8()",
"status" : "PASSED",
"message" : null
}, {
"name" : "solveReturnsFalseForN2()",
"status" : "PASSED",
"message" : null
}, {
"name" : "solveReturnsFalseForN3()",
"status" : "PASSED",
"message" : null
} ]
}
}