{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du das aktuelle Rechteck bei jedem Rekursionsschritt, statt nur im Abbruchfall (bei `n == 0`). Dadurch entsteht eine andere (zu “volle”) Zeichnung als gefordert.\n- In `Boxes.drawRec` fehlt der vierte Teil (unten links). Du rufst nur drei Quadranten rekursiv auf.\n- In `Boxes.drawRec` ist dein Abbruchkriterium `n < 0`; damit wird bei `n == 0` noch weiter rekursiv gearbeitet (und gezeichnet), was nicht dem vorgesehenen Rekursionsschema entspricht.\n- In `Triangles.drawRec` zeichnest du das Dreieck in jedem Rekursionsschritt, statt nur im Basisfall (`n == 0`). Das führt ebenfalls zu einer anderen Ausgabe als erwartet.\n- In `Triangles.drawRec` ist das Abbruchkriterium wieder `n < 0`; bei `n == 0` werden noch Rekursionsaufrufe gemacht und zusätzliche Linien gezeichnet.\n\n### Suggestion\n- Überlege dir für beide Formen eine klare Basis: “Wann zeichne ich *genau ein* Element und höre auf?” (typisch: `n == 0`) und “Wann teile ich nur auf und zeichne noch nicht selbst?”\n- Bei den Boxen: Prüfe, ob du wirklich alle vier Teilquadrate berücksichtigst (oben links, oben rechts, unten rechts, unten links) und ob alle die korrekten `(x,y)`-Offsets bekommen.\n- Bei den Boxen: Wenn du in der Rekursion `s` halbierst, achte darauf, dass du die ursprüngliche Größe nicht “verlierst” und die Offsets konsistent zur halbierten Größe sind.\n- Bei den Dreiecken: Versuche, die Logik so aufzubauen, dass du im Rekursionsfall nur die drei “Eck”-Dreiecke aus den Seitenmittelpunkten bildest, und das Zeichnen der Linien ausschließlich im Basisfall machst.\n- Bei beiden: Teste gezielt mit kleinen `n` (z.B. `n=0`, `n=1`, `n=2`) und überprüfe: Bei `n=0` sollte genau die “Grundform” erscheinen (ein Quadrat bzw. ein Dreieck) – ohne weitere Unterteilung.\n\n### Code Style\n- Du hast in beiden Klassen noch die `// TODO implement`-Kommentare stehen, obwohl du schon implementiert hast; die solltest du entfernen/aktualisieren.\n- In `Triangles.drawRec` ist eine auskommentierte Zeile (`//drawRec(...)`) übrig geblieben; solche Reste besser entfernen, sobald du dich entschieden hast.\n- Statt `if (n < 0) return;` wäre ein klarer, lesbarer Basisfall (`n == 0`) leichter nachvollziehbar (auch für dich beim Debuggen), und der Rekursionsfall dann als `else`.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(int i)` entlädst du am Ende immer `maxN + 1`-mal (`for (j = 0; j <= maxN; j++)`), obwohl du im schlimmsten Fall nur `maxN`-mal geladen hast. Dadurch wird `currWeight`/`currValue` zu klein (sogar negativ) und der Zustand für höhere Rekursions-Ebenen stimmt nicht mehr.\n- Das Entladen ist nicht an die tatsächlich geladene Anzahl gekoppelt. Wenn z.B. wegen `currWeight > maxWeight` früh zurückgesprungen wird, kann es sein, dass das spätere pauschale Entladen (in anderen Fällen) nicht mehr zum aktuellen Ladezustand passt.\n- `KnapsackN.main()` hat nicht die übliche Signatur `main(String[] args)`. Falls die Tests/Runner die Standard-Signatur erwarten, wird `main` nicht ausgeführt.\n\n### Suggestion\n- Tracke pro Item, wie oft du es in der aktuellen Verzweigung wirklich eingeladen hast, und mache am Ende genau so viele `unloadItem`-Schritte rückgängig (nicht mehr, nicht weniger).\n- Überlege dir eine klare Struktur: erst die Variante „0 Stück von Item i“, dann schrittweise 1..maxN Stück hinzufügen, jeweils rekursiv weitergehen, und am Ende den Zustand wieder exakt auf „0 Stück“ zurücksetzen.\n- Prüfe die `main`-Methodensignatur in der Vorlage/bei den Tests: Wenn dort `public static void main(String[] args)` erwartet ist, passe sie daran an.\n\n### Code Style\n- In `pack` stehen viele `// TODO`-Kommentare, obwohl du schon Code implementiert hast; das macht es schwerer zu erkennen, was noch offen ist.\n- Die beiden Schleifen am Ende (`for ... unloadItem`) wirken „magisch“ und schwer nachvollziehbar; besser ist es, das Rückgängigmachen direkt an die Anzahl der tatsächlichen `loadItem`-Aufrufe zu koppeln (lesbarer und weniger fehleranfällig).\n- Inkonsistente Einrückung/Formatierung (z.B. Methoden `loadItem`/`unloadItem` stehen optisch anders eingerückt als der Rest).\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 die Applikation typischerweise nicht startbar sein (Entry-Point fehlt).\n- In `nofSolutions(...)` wird das `max`-Limit in der Rekursion nicht korrekt “verbraucht”: du rufst rekursiv immer mit demselben `max` weiter, dadurch kann die Gesamtanzahl der gefundenen Lösungen `MAX` überschreiten, obwohl laut Aufgabenstellung nach `MAX` abgebrochen werden soll.\n- In `nofSolutions(...)` setzt du das Feld nach dem Durchlauf zwar zurück, aber beim Fall “Zahl ist gültig und rekursiver Call liefert Lösungen” wird vor dem nächsten Kandidaten bereits gecleart; das ist ok. Allerdings fehlt am Ende (wenn alle Kandidaten getestet) eine garantierte Rücksetzung genau einmal (bei dir passiert es pro Iteration) — funktional meist ok, aber die Anforderung “Model was reset to its initial state” hängt stark daran, dass wirklich alle von dir gesetzten Werte sauber zurückgenommen werden (insb. bei frühem Return durch `zähler >= max`).\n\n### Suggestion\n- Schau dir die JVM-Startsignatur für `main` an: Welche Modifier/Parameter braucht es, damit die GUI überhaupt gestartet wird?\n- Überlege bei `nofSolutions`: Wenn du schon `zähler` Lösungen gefunden hast, wie viele weitere darfst du maximal noch suchen? Gib diesen “Rest” in den rekursiven Aufruf weiter, statt immer wieder das ursprüngliche `max` zu verwenden.\n- Prüfe gedanklich den Abbruchfall `zähler >= max`: Stelle sicher, dass bei jedem vorzeitigen Return alle Felder, die in *diesem* Stack-Frame gesetzt wurden, wieder zurückgesetzt sind, sodass das Model am Ende wirklich im Ausgangszustand ist.\n\n### Code Style\n- Vermeide Umlaute in Variablennamen wie `zähler`; nutze z.B. `count`/`solutions` (bessere Portabilität, üblicher Java-Stil).\n- Kommentare enthalten viele Tippfehler/Inkonsistenzen (“Cheken”, “Umrechunng”, “filedNr”); das erschwert das Lesen.\n- Einheitliche Einrückung/Formatierung (z.B. in `SudokuModel.java` ist der Kommentarblock bei `set` anders eingerückt als der Rest).\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" : "FAILED",
"message" : "Connection refused to host: 172.25.0.14; nested exception is: \n\tjava.net.ConnectException: Connection refused"
}, {
"name" : "random2()",
"status" : "FAILED",
"message" : "expected: <340> but was: <246>"
}, {
"name" : "random3()",
"status" : "FAILED",
"message" : "expected: <558> but was: <544>"
}, {
"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" : "FAILED",
"message" : "Connection refused to host: 172.25.0.15; nested exception is: \n\tjava.net.ConnectException: Connection refused"
}, {
"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" : "FAILED",
"message" : "Connection refused to host: 172.25.0.16; nested exception is: \n\tjava.net.ConnectException: Connection refused"
}, {
"name" : "solveReturnsFalseForN3()",
"status" : "PASSED",
"message" : null
} ]
}
}