AutoFeedback API

Result 338306b9-abbe-45b0-859f-e697178106e9

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du das Rechteck für **jede** Rekursionsebene (auch wenn `n > 0`), statt nur im Abbruchfall; dadurch entsteht nicht die geforderte rekursive Box-Struktur.\n- In `Boxes.drawRec` fehlt der vierte Teil (unten links): du rufst nur drei Quadranten rekursiv auf.\n- In `Boxes.drawRec` ist der Abbruchfall falsch gewählt (`n < 0`): bei `n == 0` wird bei dir weiter rekursiv aufgeteilt und es werden zusätzliche (kleinere) Rechtecke gezeichnet.\n- In `Triangles.drawRec` zeichnest du das Dreieck ebenfalls auf **jeder** Ebene; dadurch werden Linien mehrfach überzeichnet und das Muster entspricht nicht der rekursiven Zielstruktur.\n- In `Triangles.drawRec` ist der Abbruchfall ebenfalls falsch (`n < 0` statt `n == 0`): bei `n == 0` gehst du noch tiefer und zeichnest weiter Unterdreiecke.\n\n### Suggestion\n- Überlege dir für beide Formen eine klare Basisbedingung: „Wann soll wirklich nur die primitive Form (ein Quadrat bzw. ein Dreieck) gezeichnet werden?“ Setze genau dort das `drawRect`/`drawLine`.\n- Für die Boxen: prüfe, wie viele Teilquadrate pro Schritt entstehen sollen und ob du alle Positionen (oben links/rechts, unten rechts/links) abdeckst; vergleiche dazu die Koordinaten-Offsets in x/y Richtung.\n- Achte bei der Rekursion darauf, dass `n` so reduziert wird, dass bei `n == 0` garantiert Schluss ist (und nicht erst bei `n < 0`).\n- Für die Dreiecke: berechne die Mittelpunkte wie du es schon machst, aber frage dich, ob du auf einer Nicht-Basis-Ebene überhaupt das große „Elterndreieck“ zeichnen willst oder nur die drei Kind-Dreiecke.\n\n### Code Style\n- Vermeide „magische“ Bedingungen wie `if (n < 0)` wenn fachlich eigentlich `n == 0` der natürliche Abbruch ist; das macht die Rekursion leichter verständlich.\n- In `Boxes.drawRec` überschreibst du den Parameter `s` (`s = s / 2;`); lesbarer wäre eine neue Variable (z.B. `half`) statt das Argument zu mutieren.\n- Entferne auskommentierten Code (z.B. die auskommentierte `drawRec(...)`-Zeile in `Triangles`), sobald du dich für eine Variante entschieden hast.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(i)` berücksichtigst du den Fall „Gegenstand i gar nicht mitnehmen“ nicht korrekt: Durch deine Schleife wird `pack(i+1)` nur in Kombination mit anschließendem `loadItem(i)` ausgeführt, aber nie als eigenständiger Zweig „0 Stück von i“ über die ganze Rekursion hinweg.\n- Deine Rekursionsstruktur erzeugt nicht alle Kombinationen von `0..maxN` Exemplaren pro Item sauber, weil du das Laden erst **nach** dem rekursiven Aufruf machst und dadurch die Reihenfolge der Zustände nicht dem „0, 1, 2, ..., maxN“-Schema pro Item entspricht.\n- Du entlädst am Ende pauschal `maxN`-mal (`for ... unloadItem`), obwohl in deinem Ablauf nicht garantiert ist, dass am Ende der Schleifen exakt `maxN`-mal geladen wurde (das hängt davon ab, ob und wie du rekursiv verzweigst). Das kann den Zustand (`currWeight`, `currValue`) verfälschen und zu falschen Ergebnissen führen.\n\n### Suggestion\n- Denk die Rekursion pro Item als echte Entscheidungs-Baum-Ebene: Für jedes Item i solltest du genau die Möglichkeiten „0 Stück“, „1 Stück“, …, „maxN Stück“ durchgehen und **für jede** dieser Varianten dann `pack(i+1)` aufrufen.\n- Achte darauf, dass du beim Backtracking immer genau so viel „zurücknimmst“, wie du in diesem Zweig zuvor hinzugefügt hast. Ein guter Check ist: Wenn `pack(i)` endet, sollten `currWeight` und `currValue` wieder exakt den Wert haben wie beim Eintritt in `pack(i)`.\n- Überlege dir, ob du einen separaten „ohne Item“-Aufruf brauchst, bevor du anfängst, das Item mehrfach zu laden (das ist oft der einfachste Weg, den „0 Stück“-Fall sicher abzudecken).\n\n### Code Style\n- In `pack` sind viele alte `TODO`-Kommentare noch drin, obwohl du schon implementiert hast; das macht den Code schwerer lesbar.\n- Die doppelten `for`-Schleifen (einmal laden/rekursiv, einmal entladen) wirken fehleranfällig; klarer wäre es, die Zustandsänderungen enger um den jeweiligen rekursiven Aufruf zu gruppieren, damit man leichter sieht, was zusammengehört.\n- `KnapsackN.main()` hat nicht die übliche Java-Signatur `main(String[] args)` (das kann je nach Test/Runner problematisch sein, auch wenn es in der Aufgabe evtl. nicht getestet wird).\n\n\n# Exercise: sudoku\n\n### Correctness\n- `nofSolutions(...)` ist noch nicht implementiert und liefert immer `0`, damit erfüllst du die Anforderung “Anzahl Lösungen zählen” nicht.\n- `Sudoku.main()` hat nicht die korrekte `public static void main(String[] args)`-Signatur; so startet die Applikation typischerweise nicht über den Java-Entry-Point.\n\n### Suggestion\n- Für `nofSolutions`: Überlege dir, wie sich dein `solved`-Backtracking ändern muss, wenn du nicht beim ersten Treffer stoppst, sondern alle gültigen Belegungen “durchzählst” (Basisfall zählt dann 1 Lösung, und rekursiv addierst du die Teilresultate).\n- Achte beim Zählen darauf, dass du die `MAX`-Grenze wirklich als Abbruchkriterium verwendest (z.B. während du Kandidaten ausprobierst), damit leere/unterbestimmte Sudokus nicht ewig laufen.\n- Für `main`: Schau dir an, welche Methodensignatur die JVM als Startpunkt erwartet und passe die Parameter/Modifier entsprechend an.\n\n### Code Style\n- In `solved(...)` sind sehr viele kommentierte “Notizen an dich selbst” im Code; das macht es schwerer zu lesen. Besser: kurze, zielgerichtete Kommentare, die das “Warum” erklären, nicht die Fragen.\n- Du verwendest mehrere “magische Zahlen” (`81`, `9`) statt `model.size()` bzw. `model.size() * model.size()`. Das macht die Methode weniger allgemein und schwerer wartbar.\n- Im `for`-Loop in `solved` machst du `model.clear(row,col)` sowohl im `else`-Zweig als auch nach einem fehlgeschlagenen rekursiven Schritt; das ist funktional ok, aber redundant und macht den Kontrollfluss unnötig kompliziert.\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
    } ]
  }
}