{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Fractal.java` ist `main` nicht `public`; so wird die Applikation typischerweise nicht als Einstiegspunkt erkannt.\n- In `Triangles.drawRec(...)` ist der Mittelpunkt der Kante zwischen `(x1,y1)` und `(x2,y2)` einmal falsch berechnet: du verwendest in einem rekursiven Aufruf für den y-Wert direkt `y2` statt den Mittelwert von `y1` und `y2`, dadurch entstehen verzerrte/„falsche“ Teil-Dreiecke.\n\n### Suggestion\n- Prüfe die Methodensignatur von `main` gegen das, was Java als Startpunkt erwartet (Zugriffsmodifier, `static`, Parameterliste).\n- Berechne für jede Dreiecksseite konsequent den Mittelpunkt als Durchschnitt beider Endpunkte (für x **und** y) und nutze diese drei Mittelpunkte dann für die drei rekursiven Teil-Dreiecke. Besonders die Seite zwischen Punkt 1 und Punkt 2 ist bei dir eine gute Stelle zum Gegencheck.\n\n### Code Style\n- In `Triangles.drawRec(...)` berechnest du dieselben Mittelpunkte mehrfach direkt in den Argumenten; speichere sie in gut benannten Variablen (macht es lesbarer und reduziert Fehler).\n- Einheitlichkeit: Du nutzt teils `n <= 0` als Basisfall. Das ist ok, aber wenn du überall mit `n` nur dekrementierst, ist `n == 0` als Basisfall meist klarer.\n- In `Fractal.java` fehlt der `public`-Modifier bei `main`; selbst wenn es je nach Setup noch laufen kann, ist das unüblich und sorgt schnell für Verwirrung.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(int i)` wird bei `currWeight <= maxWeight` zwar rekursiv weiter verzweigt, aber es fehlt ein Abbruch/Überspringen der weiteren Rekursion, sobald durch `loadItem(i)` das Gewicht über `maxWeight` steigt; dadurch werden Zustände weiter exploriert, die den Gewichts-Constraint bereits verletzt haben (Tests können das je nach Erwartung als falsch/zu langsam werten).\n\n### Suggestion\n- Prüfe an welcher Stelle du die Bedingung `currWeight <= maxWeight` **nach** jedem Hinzufügen eines Items erneut berücksichtigen solltest, damit Pfade, die das Maximalgewicht überschreiten, nicht weiter rekursiv verfolgt werden.\n\n### Code Style\n- Die Struktur in `pack` ist etwas schwer zu lesen, weil `pack(i + 1)` mehrfach in/außerhalb der Schleifen vorkommt; überlege, ob du die Fälle „0 Stück nehmen“ und „1..maxN Stück nehmen“ klarer trennst (z.B. erst „0“ behandeln, dann in einer Schleife sukzessive laden und jeweils verzweigen).\n- `unloadItem(int i)` wird in einer Schleife `maxN`-mal aufgerufen; funktional ok, aber eine Variante, die in einem Schritt genau das rückgängig macht, was du zuvor für dieses Item geladen hast, wäre leichter nachvollziehbar (insbesondere beim späteren Debuggen).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `nofSolutions(...)` wird das Parameter `max` nicht korrekt als Obergrenze verwendet: du gibst in der Rekursion immer wieder das gleiche `max` weiter und brichst erst ab, wenn `solutions > max` ist; dadurch kannst du mehr als `MAX` Lösungen zählen/zurückgeben, obwohl laut Interface nach spätestens `MAX` Schluss sein soll.\n- In `nofSolutions(...)` wird das Modell nach dem Zählen nicht garantiert in den Initialzustand zurückgesetzt: beim vorzeitigen `return solutions` (wenn `solutions > max`) bleibt das aktuell gesetzte Feld (und damit u.U. weitere gesetzte Felder im Rekursions-Stack) im Modell stehen.\n- `Sudoku.main()` hat nicht die geforderte Java-Entry-Signatur (`public static void main(String[] args)`), dadurch startet die Applikation so nicht wie erwartet.\n\n### Suggestion\n- Für die Begrenzung auf `MAX`: Überlege dir, wie du beim Zurückkehren aus der Rekursion nur noch “verbleibende Kapazität” weitergibst (also wie viele Lösungen du maximal noch finden darfst) und wann genau du abbrechen musst (Grenze inklusive vs. exklusiv).\n- Für das Zurücksetzen des Modells: Achte darauf, dass jede Stelle, an der du aus `nofSolutions` frühzeitig zurückkehrst, vorher den aktuellen Zug rückgängig macht (und dass das auch bei Abbrüchen tief in der Rekursion gilt). Ein hilfreicher Check ist: “Kann irgendein `return` ausgeführt werden, ohne dass das aktuelle Feld wieder `clear` wird?”\n- Für `main`: Vergleiche deine Methodensignatur mit der üblichen Java-`main`-Methode und passe Sichtbarkeit + `static` + Parameter an.\n\n### Code Style\n- In `solved(...)` und `nofSolutions(...)` sind die Magic Numbers `9`, `10`, `81` hart codiert; nutze stattdessen `model.size()` (und ggf. `model.size() * model.size()`), damit es konsistent bleibt und nicht “zufällig” nur für 9x9 funktioniert.\n- Du rufst in `nofSolutions(...)` an mehreren Stellen `model.clear(x, y)` auf (teilweise doppelt im selben Schleifendurchlauf). Das ist zwar nicht automatisch falsch, macht den Kontrollfluss aber unnötig schwer nachvollziehbar.\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" : "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
} ]
}
}