AutoFeedback API

Result 76d5bb5d-b3db-4508-adb2-9458e38f86ed

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Fractal.java` ist die `main`-Methode nicht `public`. Die JVM findet den Einstiegspunkt nur mit der Signatur `public static void main(String[] args)`.\n- In `Triangles.drawRec(...)` ist beim zweiten rekursiven Aufruf ein falscher Mittelpunkt verwendet: du setzt für den dritten Punkt `(..., (x1 + x2) / 2, y2, ...)` die y-Koordinate einfach auf `y2` statt den Mittelpunkt zwischen `y1` und `y2` zu nehmen. Dadurch wird das untere/rechte Teil-Dreieck geometrisch verzerrt.\n\n### Suggestion\n- Schau dir die Methodensignatur deiner `main` exakt an und vergleiche sie mit der üblichen Java-Einstiegspunkt-Signatur; schon ein fehlendes `public` verhindert das Starten.\n- Berechne für die Dreiecks-Rekursion konsequent die drei Seiten-Mittelpunkte (zwischen (0-1), (0-2), (1-2)) und nutze jeweils **beide** Koordinaten (x **und** y) dieser Mittelpunkte in den rekursiven Aufrufen. Prüfe speziell den Punkt zwischen `(x1,y1)` und `(x2,y2)` im zweiten Aufruf.\n\n### Code Style\n- In `Triangles.drawRec(...)` werden die gleichen Mittelpunkt-Ausdrücke mehrfach direkt im Methodenaufruf berechnet; speichere sie in lokale Variablen (lesbarer, weniger Fehleranfällig).\n- `if (n <= 0)` funktioniert, aber da `n` im Programm ohnehin nicht negativ werden sollte, ist `n == 0` als Basisfall klarer zu lesen.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(int i)` fügst du den Gegenstand immer mindestens 1× hinzu, weil du im ersten `for`-Loop nach jedem `pack(i + 1)` direkt `loadItem(i)` machst. Der Fall „0× von Item i“ wird dadurch nicht sauber als eigener Zweig behandelt (du rufst zwar später noch `pack(i + 1)` auf, aber da ist der Zustand bereits verändert worden).\n- Du prüfst `currWeight <= maxWeight` nur am Anfang von `pack(i)`. Innerhalb des Loops kann `currWeight` durch `loadItem(i)` über `maxWeight` steigen, trotzdem rufst du weiter rekursiv `pack(i + 1)` auf und lädst weiter Items – das verletzt die Idee, dass nur gültige Packungen weiterverfolgt werden sollen.\n\n### Suggestion\n- Überlege dir für jedes Item i eine klare Branch-Struktur: „0 Stück“, „1 Stück“, …, „maxN Stück“. Achte darauf, dass der Rekursionsaufruf jeweils zu einem eindeutig passenden Zustand gehört (also vor/nach dem Laden).\n- Baue eine Abbruch-/Guard-Bedingung ein, sobald das aktuelle Gewicht das Maximum überschreitet, damit du nicht weiter in ungültigen Zuständen suchst. Prüfe am besten direkt nach dem Laden (oder vor dem nächsten Rekursionsschritt), ob du überhaupt noch weitergehen willst.\n\n### Code Style\n- Die Logik in `pack` ist durch die Kombination aus zwei Loops und einem zusätzlichen `pack(i + 1)` etwas schwer nachzuvollziehen. Eine Struktur, die „Anzahl n“ explizit als Variable führt (und dazu klar lädt/entlädt), wäre lesbarer.\n- In `KnapsackN` ist `main()` ohne `String[] args` (wie in der Vorlage) unüblich; falls die Tests/Runner ein echtes Java-`main` erwarten, kann das irritieren.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl.nofSolutions(...)` ist noch `// TODO implement` drin und die Methode gibt immer `0` zurück, damit erfüllst du die Anforderung “Anzahl Lösungen zählen” nicht.\n- `Sudoku.java`: Deine `main`-Methode hat nicht die Signatur `public static void main(String[] args)`, dadurch startet das Programm (und damit auch die GUI) nicht wie erwartet.\n\n### Suggestion\n- Für `nofSolutions`: Überlege dir, wie sich dein Backtracking aus `solved(...)` anpassen lässt, sodass du **nicht beim ersten Fund stoppst**, sondern **für jede vollständige Belegung** einen Zähler erhöhst. Wichtig ist auch, dass du beim Zurückkehren (Backtracking) das Feld wieder leerst.\n- Für `MAX`: In der Aufgabenbeschreibung steht, dass nach `MAX` Lösungen abgebrochen werden darf. Ein hilfreicher Ansatz ist, beim Rekursionsaufruf “verbleibendes Budget” weiterzugeben und die Schleife zu stoppen, sobald das Budget aufgebraucht ist.\n- Für `Sudoku.main`: Schau dir an, welche Methodensignatur Java als Programmeinstiegspunkt akzeptiert (Stichwort: `static`, Parameterliste).\n\n### Code Style\n- In `solved(...)` verwendest du feste Zahlen (`9`, `81`, `10`). Besser wäre es, überall `model.size()` (und daraus abgeleitet `size*size`) zu nutzen, damit der Solver nicht “hart” auf 9x9 verdrahtet ist.\n- Die Variablennamen `x`/`y` sind bei Sudoku schnell verwirrend (bei dir ist `x` eigentlich Zeile und `y` Spalte). Klarere Namen wie `i`/`j` oder `row`/`col` reduzieren Denkfehler.\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
    } ]
  }
}