AutoFeedback API

Result b6da7fce-4737-4bb5-8ff5-f2849fab711a

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec`, du zeichnest immer zuerst ein Rechteck und gehst dann nur weiter, wenn `n > 1`; damit wird bei `n == 1` keine weitere Unterteilung gemacht (die Rekursionstiefe entspricht damit nicht dem Parameter `n` wie erwartet).\n- In `Boxes.drawRec` fehlt der untere linke Teil-Quadrant (es werden nur 3 rekursive Aufrufe gemacht).\n- In `Triangles.drawRec`, du zeichnest das Dreieck in jedem Rekursionsschritt erneut, statt nur im Abbruchfall (bei `n == 0`) zu zeichnen.\n- In `Triangles.drawRec`, du rekursierst nur bei `n > 1`; damit ist bei `n == 1` wieder keine Unterteilung vorhanden (Rekursionstiefe passt nicht sauber zu `n`).\n- In `Triangles.drawRec`, die berechneten Teil-Dreiecke verwenden teils Punkte, die nicht zu den Mittelpunkten der ursprünglichen Kanten passen (z.B. `x0, y1` wird als Punkt verwendet, obwohl das kein Kantenmittelpunkt ist); dadurch entsteht nicht die gewünschte rekursive Dreiecksstruktur.\n\n### Suggestion\n- Überlege dir für beide Formen eine klare Basisbedingung: bei welchem `n` soll *nur* die aktuelle Form gezeichnet werden, und bei welchem `n` sollen *nur* Unterformen erzeugt werden?\n- Bei den Boxen: prüfe, ob du wirklich alle vier Quadranten erzeugst, und ob du für jeden rekursiven Aufruf die passenden `(x,y)`-Offsets verwendest.\n- Bei den Dreiecken: berechne zuerst konsequent die drei Kantenmittelpunkte (jeweils Mittelwert der beiden Endpunkte einer Kante) und baue daraus die drei Kind-Dreiecke; vermeide “zusammengebastelte” Punkte wie `(x0, y1)`, die nicht aus den Kanten stammen.\n- Achte darauf, dass `n == 1` noch “eine Rekursionsstufe” bedeutet (also typischerweise: einmal unterteilen und dann bei `n-1` in den Basisfall laufen), statt dass bei `n == 1` gar nichts mehr passiert.\n\n### Code Style\n- In beiden Klassen wäre es lesbarer, wenn du `s /= 2` nicht die Variable überschreibt, sondern mit einer neuen Variable (z.B. `half`) arbeitest; so sind die Offsets klarer nachzuvollziehen.\n- In `Triangles.drawRec` sind die Punktnamen `x3/x4` etc. schwer nachzuvollziehen; sprechende Namen wie `mid01`, `mid02`, `mid12` (oder ähnlich) machen die Geometrie deutlich verständlicher.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(i)` fehlt der Fall „Gegenstand i gar nicht einpacken“: Du rufst `pack(i + 1)` nur nach mindestens einem `loadItem(i)` auf, aber nie mit `n=0`. Dadurch werden Lösungen ausgeschlossen, bei denen ein Item komplett weggelassen wird.\n- Der zweite `while (n > 0)`-Block verändert den Suchraum falsch: Nach dem „Aufräumen“ (`unloadItem`) rufst du erneut `pack(i + 1)` auf. Damit kombinierst du Zustände, die nicht mehr zum aktuellen „n Stück von Item i“ passen, und du erzeugst doppelte/inkonsistente Pfade.\n- Durch die Kombination aus `while (currWeight <= maxWeight && n < maxN)` und dem fehlenden `pack(i+1)` für `n=0` kannst du zudem bestimmte gültige Kombinationen nicht erreichen (z.B. nur spätere Items, ohne das aktuelle jemals zu nehmen).\n\n### Suggestion\n- Denk beim Rekursionsschritt für ein Item immer an alle Möglichkeiten für dieses Item: „0 Stück“ bis „maxN Stück“ (oder bis Gewichtslimit). Prüfe, ob dein Code wirklich den Fall „0 Stück“ abdeckt, bevor du das Item einmal lädst.\n- Achte darauf, dass „Backtracking“ nur den Zustand wiederherstellt (Gewicht/Wert), aber nicht zusätzlich neue Rekursionsaufrufe auslöst. Überlege: Wann genau willst du `pack(i+1)` aufrufen—einmal pro gewählter Stückzahl—und wann nur zurücksetzen?\n- Ein guter Check ist: Wenn du für ein fixes `i` alle Stückzahlen ausprobiert hast, muss `currWeight/currValue` am Ende exakt wieder so sein wie beim Eintritt in `pack(i)`.\n\n### Code Style\n- Die zwei `while`-Schleifen in `pack` machen die Logik schwer nachvollziehbar (insbesondere durch das zweite `pack(i+1)` im „Unloading“-Teil). Eine klare Struktur „für jede Stückzahl: recurse; danach Zustand zurücksetzen“ wäre deutlich lesbarer.\n- `KnapsackN.main()` hat nicht die übliche Java-Signatur (`main(String[] args)`), falls das im Template/Tests erwartet wird (auch wenn das nicht Teil der Knapsack-Logik ist).\n\n\n# Exercise: sudoku\n\n### Correctness\n- `nofSolutions` zählt nicht alle Lösungen, sondern bricht effektiv nach der ersten gefundenen Lösung pro Pfad ab (durch die Verwendung von `found` als Schleifen-Abbruchbedingung).\n- `nofSolutions` setzt das Sudoku am Ende nicht zuverlässig auf den Initialzustand zurück, weil das Leeren (`model.clear(i, j)`) an `found` gekoppelt ist und bei gefundenen Lösungen das gesetzte Feld bestehen bleiben kann.\n- Die Begrenzung über `max` wird in `nofSolutions` nicht korrekt umgesetzt, weil `max` nicht “verbraucht”/reduziert wird, wenn du weitere Lösungen findest; dadurch kann die Rekursion nicht sinnvoll frühzeitig stoppen, sobald `MAX` erreicht ist.\n\n### Suggestion\n- Beim Zählen brauchst du eine Schleife, die **für jeden gültigen Wert** rekursiv weiterzählt und die Anzahl **aufsummiert**, statt nach dem ersten Treffer mit einem `found`-Flag abzubrechen.\n- Achte darauf, dass du beim Backtracking ein Feld **immer** wieder zurücksetzt, nachdem du alle Versuche für dieses Feld durch hast (unabhängig davon, ob zwischendurch Lösungen gefunden wurden).\n- Wenn du ein `max`-Limit verwenden willst: Überlege dir, wie du bei jedem rekursiven Rücksprung das verbleibende “Budget” an noch erlaubten Lösungen mitgibst (z.B. `max - bisherGefunden`) und die Schleife abbrichst, sobald das Budget aufgebraucht ist.\n\n### Code Style\n- In `nofSolutions` ist `boolean found` irreführend, weil “eine Lösung existiert” etwas anderes ist als “wie viele Lösungen gibt es”; das macht die Logik schwerer verständlich.\n- `Math.min(noOfSolutions, max)` an mehreren Rückgabestellen kaschiert eher Logikfehler; besser ist es, die Begrenzung strukturell durch Abbruchbedingungen während der Suche zu erzwingen, statt am Ende Werte zu kappen.\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
    } ]
  }
}