AutoFeedback API

Result 40bf046b-70c2-4da5-96f0-b39cba4a1674

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du in jedem Rekursionsschritt sofort ein Quadrat (auch wenn `n > 0`). Dadurch werden deutlich mehr/andere Rechtecke gezeichnet als gefordert (die Rekursion soll die Zeichnung erst im Basisfall “auslösen” bzw. klar zwischen Basisfall und Rekursionsfall trennen).\n- In `Boxes.drawRec` fehlt der rekursive Aufruf für das unten-links-Quadrat; aktuell zeichnest du nur oben-links, oben-rechts und unten-rechts weiter.\n- In `Triangles.drawRec` zeichnest du in jedem Rekursionsschritt das aktuelle Dreieck (auch wenn `n > 0`). Damit wird nicht nur die kleinste Stufe gezeichnet, sondern jede Stufe zusätzlich – das entspricht nicht der geforderten rekursiven Zerlegung mit Basisfall.\n- In `Triangles.drawRec` ist deine Abbruchbedingung `n < 0`. Für `n == 0` wird noch weiter rekursiv aufgerufen (mit `n - 1`), was extra Ebenen erzeugt und die Rekursion nicht so stoppt, wie es die Aufgabenstellung/typische Fraktaldefinition erwartet.\n\n### Suggestion\n- Überlege dir bei beiden Formen eine klare Struktur: **wenn `n == 0`** zeichnen (Basisfall), **sonst** nur Teilprobleme berechnen und rekursiv aufrufen (Rekursionsfall), ohne zusätzlich noch “das große” Objekt zu zeichnen.\n- Bei den Boxen: Prüfe, welche 4 Teilquadrate bei Halbierung entstehen (Koordinaten: `(x,y)`, `(x+s/2,y)`, `(x,y+s/2)`, `(x+s/2,y+s/2)`). Vergleiche das mit deinen drei Aufrufen und ergänze das fehlende Teilquadrat.\n- Bei den Dreiecken: Setze die Abbruchbedingung so, dass bei der gewünschten kleinsten Stufe wirklich Schluss ist (statt erst “eine Ebene später”). Dann zeichne das Dreieck nur in genau diesem Fall.\n- Bei den Dreiecken: Du berechnest die Mittelpunkte inline mehrfach. Kontrolliere, ob die drei rekursiven Dreiecke wirklich die drei “Eck-Dreiecke” sind (oben, unten-links, unten-rechts) und nicht zusätzlich ein zentrales/überlappendes Muster durch das Zeichnen auf jeder Ebene entsteht.\n\n### Code Style\n- In `Triangles.drawRec` sind die Midpoint-Berechnungen mehrfach inline; lesbarer wird es, wenn du sie einmal in Variablen speicherst (das reduziert auch Fehler beim Vertauschen von Koordinaten).\n- Die auskommentierte Zeile `//drawRec(...)` in `Triangles` ist toter Code und sollte entfernt werden, sobald du dich für einen Ansatz entschieden hast.\n- `if (n < 0) return;` wirkt als “Notbremse”, verdeckt aber die eigentliche Rekursionslogik; verständlicher ist eine Abbruchbedingung, die direkt zur Aufgabendefinition passt (Basisfall klar erkennbar).\n\n\n# Exercise: knapsack\n\n### Correctness\n- Du berücksichtigst `maxN` aktuell nicht: In deinem `pack`-Zweig wird ein Gegenstand höchstens einmal geladen (`loadItem(i)` genau einmal), obwohl laut Aufgabe jeder Gegenstand bis zu `maxN`-mal vorkommen darf.\n- In `pack(int i)` führst du im “ohne Item i”-Fall eine Schleife `for(int j = 0; j < weights.length; j++) pack(i+1);` aus. Dadurch wird derselbe Rekursionszweig mehrfach identisch durchlaufen (Du entscheidest nicht über `j`), was zu falschem/unnötigem Suchverhalten führt und die Logik “Item i überspringen” verfälscht.\n- `unloadItem(i)` macht nur ein einzelnes Laden rückgängig. Falls du (wie gefordert) ein Item mehrfach laden würdest, reicht dieses Entladen nicht, um den Zustand wieder korrekt auf den Stand vor dem “n-mal laden” zurückzusetzen.\n\n### Suggestion\n- Überlege dir für jedes Item `i`, welche Möglichkeiten es geben soll: nicht nehmen, 1x nehmen, 2x nehmen, … bis `maxN`-mal. Implementiere das als Iteration über die Anzahl, bevor du zu `i+1` weitergehst.\n- Der “ohne Item i”-Fall braucht keine Schleife über `weights.length`; ein einziger rekursiver Aufruf für “i nicht nehmen” reicht. Frag dich: Welche Entscheidung triffst du in diesem Schritt wirklich?\n- Wenn du ein Item mehrfach lädst, achte darauf, dass du am Ende dieses Items den Zustand (`currWeight`, `currValue`) wieder vollständig auf den vorherigen Stand zurückbringst (entweder in einem Schritt oder passend zur Anzahl der Ladevorgänge).\n\n### Code Style\n- In `pack` sind viele `// TODO implement`-Kommentare und gemischte/halbfertige Kommentare; räum die auf bzw. ersetze sie durch kurze, präzise Kommentare, die die Rekursionsfälle beschreiben.\n- Die Schleife `for(int j = 0; j < weights.length; j++)` verwendet `j` nicht; das ist ein starkes Warnsignal (verwirrt Leser:innen und deutet auf einen Logikfehler hin).\n- `KnapsackN.main()` hat nicht die übliche Signatur `main(String[] args)` (falls das in den Tests/bei Ausführung erwartet wird, ist das unpraktisch).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl.nofSolutions(...)` ist noch keine Logik implementiert (liefert immer `0`) und erfüllt damit die Anforderung “Anzahl Lösungen zählen” nicht.\n- In `Sudoku.java` ist die `main`-Methode nicht als Java-Entry-Point definiert (Signatur/`public static`), dadurch startet die Applikation in der Regel nicht wie erwartet.\n\n### Suggestion\n- Für `nofSolutions`: Überlege dir, wie sich dein Backtracking aus `solved` anpasst, wenn du **nicht beim ersten Treffer zurückgibst**, sondern **alle gültigen Belegungen weiterzählst**. Achte dabei darauf, dass du bei jedem rekursiven Rücksprung den Zustand des Feldes wieder zurücksetzt und dass du die Suche abbrichst, sobald du `MAX` erreicht hast.\n- Für `Sudoku.main`: Schau dir an, welche Methodensignatur die JVM beim Start sucht (Parameter, `static`, Sichtbarkeit) und passe deine Methode entsprechend an, ohne die restliche Initialisierung zu ändern.\n\n### Code Style\n- In `solved(...)` hast du viel “Gedanken-/Notiz”-Kommentar im Code. Das ist zum Lernen okay, aber fürs Abgeben besser stark kürzen bzw. in kurze, präzise Kommentare umwandeln (oder ganz entfernen), damit die eigentliche Logik leichter lesbar bleibt.\n- In `solved(...)` sind `81`, `9` als Magic Numbers hart codiert. Besser wäre, konsequent `model.size()` (und ggf. `model.size()*model.size()`) zu verwenden, dann funktioniert es auch, falls die Modellgröße mal geändert wird.\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" : "expected: <190> but was: <174>"
    }, {
      "name" : "random2()",
      "status" : "FAILED",
      "message" : "expected: <340> but was: <279>"
    }, {
      "name" : "random3()",
      "status" : "FAILED",
      "message" : "expected: <558> but was: <357>"
    }, {
      "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
    } ]
  }
}