AutoFeedback API

Result 78700e1a-011e-4064-94b5-b413cd5e715a

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du bei jedem Rekursionsschritt sofort ein Rechteck und gehst dann weiter; damit entspricht das Ergebnis nicht der geforderten Rekursionsstruktur, bei der (nur) im Basisfall gezeichnet wird und sonst die Teilquadrate rekursiv erzeugt werden.\n- In `Boxes.drawRec` fehlt ein rekursiver Aufruf für das unten-links-Quadrat; aktuell werden nur drei der vier Quadranten weiterverarbeitet.\n- In `Triangles.drawRec` zeichnest du das Dreieck in jedem Rekursionsschritt; dadurch werden bei `n > 0` auch die “großen” Dreiecke mitgezeichnet, statt nur die kleinsten Dreiecke im Basisfall.\n- In `Triangles.drawRec` ist der Abbruchfall auf `n < 0` gelegt; bei `n == 0` wird trotzdem weiter rekursiv aufgerufen (mit `-1`), was bedeutet, dass du nicht sauber beim gewünschten Rekursionstiefen-Parameter stoppst.\n\n### Suggestion\n- Überlege dir für beide Formen eine klare Basisfall-Regel: Wann genau soll wirklich gezeichnet werden, und wann sollen nur kleinere Teilformen berechnet/aufgerufen werden?\n- Bei den Boxen: prüfe, ob deine Rekursion in jedem Schritt wirklich alle vier Teilquadrate abdeckt (top-left, top-right, bottom-right, bottom-left) und ob eines davon eventuell “anders” behandelt werden soll.\n- Bei den Dreiecken: kontrolliere, ob du beim Schritt `n > 0` nur die drei Eck-Dreiecke weiterverfolgst und nicht zusätzlich jedes Mal den aktuellen (größeren) Rand erneut zeichnest.\n- Setze den Stopp so, dass bei `n == 0` keine weiteren rekursiven Aufrufe mehr passieren; dann brauchst du auch keinen “Notnagel”-Abbruch bei `n < 0`.\n\n### Code Style\n- In beiden Klassen ist der `if (n < 0) return;`-Abbruch eher ein Workaround; lesbarer ist es, den Basisfall explizit auf `n == 0` (oder `n <= 0`) aufzubauen, sodass keine negativen Werte überhaupt entstehen müssen.\n- In `Boxes.drawRec` überschreibst du den Parameter `s` direkt (`s = s / 2;`); verständlicher ist oft, mit einer neuen lokalen Variable für die halbe Größe zu arbeiten (macht das Nachvollziehen der Koordinaten leichter).\n- In `Triangles.drawRec` ist die auskommentierte Zeile (`//drawRec(...)`) toter Code und sollte entfernt werden, wenn du sie nicht mehr brauchst.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(int i)` wird der Fall „0 Stück von Item i“ nicht korrekt abgedeckt: Du rufst `pack(i + 1)` nur innerhalb der `for (j < maxN)`-Schleife auf, d.h. es gibt keinen Pfad, der Item `i` wirklich komplett auslässt.\n- Deine Rekursion erzeugt nicht sauber die Kombinationen „genau n-mal“ pro Item: Durch die Reihenfolge `pack(i + 1)` *vor* `loadItem(i)` in der Schleife entsteht eine verschobene Zählung (du evaluierst jeweils den Zustand *vor* dem nächsten Laden), wodurch die Fälle „1..maxN Stück von Item i“ nicht wie beabsichtigt systematisch geprüft werden.\n- Das Entladen am Ende passiert unabhängig davon, wie viele Stück du tatsächlich geladen hast (du entlädst immer `maxN`-mal). Das ist nur dann korrekt, wenn du zuvor garantiert auch genau `maxN`-mal geladen hast; durch deine aktuelle Kontrolllogik ist das sehr fragil und kann bei Änderungen/Fehlern schnell zu einem falschen `currWeight/currValue` führen.\n\n### Suggestion\n- Überlege dir eine Struktur, in der du für jedes Item zuerst den „ohne dieses Item“-Zweig ausführst und danach schrittweise 1x, 2x, …, `maxN`x dieses Item hinzufügst und jeweils rekursiv weitergehst.\n- Achte darauf, dass „wie oft wurde geladen“ und „wie oft wird entladen“ exakt zusammenpassen. Eine Möglichkeit ist, das Entladen an die Anzahl tatsächlich geladener Stücke zu koppeln (oder am Ende alles in einem Schritt zurückzunehmen, aber dann nur um genau die Menge, die du vorher hinzugefügt hast).\n- Prüfe mit einem kleinen Beispiel (z.B. 1 Item, kleines `maxWeight`, `maxN=3`), ob dein Baum wirklich die Fälle 0/1/2/3-mal durchläuft und ob der Zustand nach Rückkehr aus der Rekursion wieder exakt derselbe ist wie davor.\n\n### Code Style\n- Viele `// TODO implement`-Kommentare sind noch drin, obwohl du implementiert hast; das macht den Code schwerer zu lesen.\n- In `pack` sind Kommentare und Kontrollfluss etwas vermischt; wenn du den Rekursionsfall klar in „Base case“ und „Recursive case“ trennst (auch optisch mit frühen `return`s), wird der Ablauf leichter nachvollziehbar.\n\n\n# Exercise: sudoku\n\n### Correctness\n- `nofSolutions` / `nofSolutions(model, fieldNr, max)` ist nicht implementiert und liefert immer `0`, damit wird die Anforderung “Anzahl Lösungen zählen (bis MAX)” nicht erfüllt.\n- `solved` verwendet fest verdrahtet `81` und die Umrechnung mit `/ 9` und `% 9` statt die Modellgröße (`model.size()`) zu verwenden; damit ist der Solver nicht korrekt für andere Sudoku-Größen, obwohl das Interface das grundsätzlich zulässt.\n- Falls `solved` `false` zurückgibt, garantiert deine Implementierung nicht, dass das Model wieder im initialen Zustand ist (Anforderung: “model was reset to its initial state” bei “no solution found”).\n\n### Suggestion\n- Für `nofSolutions`: Übernimm die gleiche Rekursionsstruktur wie bei `solved`, aber statt beim ersten Fund abzubrechen solltest du “Treffer zählen” und weiter suchen; denk dabei daran, nach dem Rekursionsaufruf wieder zurückzusetzen (Backtracking) und bei `max` frühzeitig aufzuhören.\n- Für die fest verdrahteten Zahlen: Ersetze überall `9`/`81` durch Ausdrücke mit `model.size()` (und ggf. `model.size() * model.size()`), dann funktioniert deine Logik auch, wenn die Modellgröße anders wäre.\n- Zum Zurücksetzen bei “nicht lösbar”: Überlege dir, welche Felder du während des Suchens veränderst und stelle sicher, dass diese beim Scheitern auf den ursprünglichen Wert zurückgehen (nicht nur das “aktuelle” Feld, sondern auch alle, die durch erfolgreiche Teilpfade gesetzt wurden).\n\n### Code Style\n- In `solved` ist die Einrückung/Blockstruktur im `for`-Loop verwirrend (das `model.clear(row, col)` steht optisch so, dass man leicht denkt, es gehöre in den `if`-Block). Klare Klammerung und konsistente Einrückung würde hier Missverständnisse vermeiden.\n- Kommentare enthalten einige Tippfehler/uneinheitliche Sprache (“Cheken”, “Umrechunng”, “filedNr”); wenn du sie beibehältst, mach sie konsistent und präzise.\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" : "FAILED",
      "message" : "expected: <340> but was: <334>"
    }, {
      "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
    } ]
  }
}