AutoFeedback API

Result 4011d9bb-15a5-4eb8-8884-7161fd83dbb9

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du bei jedem Rekursionsschritt sofort ein Rechteck und gehst dann weiter runter; dadurch werden bei `n > 0` auch die “Zwischen-Levels” gezeichnet, statt nur die kleinsten (Basisfall) Rechtecke.\n- In `Boxes.drawRec` fehlt der rekursive Aufruf für das unten-links-Quadrat; du zeichnest nur oben-links, oben-rechts und unten-rechts.\n- In `Boxes.drawRec` ist der Abbruchfall an `n < 0` geknüpft; damit läuft die Rekursion noch für `n == 0` weiter (sie stoppt erst nach den Aufrufen mit `n - 1`), was nicht dem üblichen “Basisfall bei n == 0” entspricht.\n- In `Triangles.drawRec` zeichnest du das Dreieck in jedem Rekursionsschritt (auch bei `n > 0`), nicht nur im Basisfall; damit überlagerst du die Rekursionsstruktur mit zusätzlichen Linien, die so nicht vorgesehen sind.\n- In `Triangles.drawRec` ist der Abbruch ebenfalls erst bei `n < 0`; dadurch wird auch bei `n == 0` noch rekursiv weiter aufgerufen (bis `-1`), statt sauber im Basisfall zu stoppen.\n\n### Suggestion\n- Überlege dir pro Form einen klaren Basisfall (z.B. `n == 0`): Was genau soll dann gezeichnet werden, und soll in diesem Fall noch rekursiv weitergegangen werden?\n- Prüfe bei den Boxes, welche Teilquadrate im nächsten Schritt entstehen müssen (Positionen relativ zu `(x, y)` und `s/2`), und ob du wirklich alle vier Teilbereiche abdeckst.\n- Wenn du verhindern willst, dass “große” Shapes bei `n > 0` gezeichnet werden, verschiebe das Zeichnen in den Basisfall und lass im Rekursionsfall nur die Unterformen erzeugen.\n- Bei den Triangles: Kontrolliere, ob du beim Rekursionsfall nur die drei “Eck-Dreiecke” weiterverfolgst und nicht zusätzlich jedes Mal das komplette aktuelle Dreieck zeichnest.\n\n### Code Style\n- Entferne auskommentierten Code (z.B. die alte `drawRec`-Zeile in `Triangles`), damit klar ist, welche Variante wirklich gilt.\n- Vermeide das Überschreiben von Parametern wie `s = s / 2;` mitten in der Methode; ein neuer lokaler Name (z.B. `half`) macht die Rekursionsaufrufe leichter nachvollziehbar.\n\n\n# Exercise: knapsack\n\n### Correctness\n- Du berücksichtigst `maxN` aktuell nicht: In `pack` nimmst du jeden Gegenstand höchstens einmal mit (0/1-Knapsack), gefordert ist aber, dass jeder Gegenstand bis zu `maxN`‑mal gewählt werden kann.\n- Durch dein aktuelles `loadItem(i)` / `unloadItem(i)` wird ein Item nur einmal geladen/entladen; damit werden Kombinationen wie `[▲ ▲ ▲]` (mehrfach derselbe Gegenstand) nie ausprobiert.\n\n### Suggestion\n- Überlege dir, wie du beim “Fall mit Gegenstand i” nicht nur **einmal**, sondern in einer Schleife **0..maxN**-mal denselben Gegenstand hinzufügen kannst, bevor du zu `i+1` weitergehst.\n- Achte darauf, dass du nach dem Durchprobieren aller `n`-Varianten den Zustand (`currWeight`, `currValue`) wieder korrekt auf den Stand **vor** dem Item `i` zurücksetzt (also nicht nur um 1 Stück zurück, falls du mehrfach geladen hast).\n\n### Code Style\n- In `pack` stehen mehrere `// TODO implement` Kommentare, obwohl du schon implementiert hast; entferne/aktualisiere die TODOs, damit klar ist, was noch offen ist.\n- Kommentare wie “Vormethode” oder sehr allgemeine Kommentare („Welche Bedingungen müssen gelten…“) sind wenig präzise; lieber kurz beschreiben, welche Rekursionsfälle/Base-Case du abdeckst.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl.nofSolutions(...)` ist noch nichts implementiert und es wird immer `0` zurückgegeben; damit wird die Anforderung “Anzahl Lösungen zählen” nicht erfüllt.\n- `Sudoku.main()` hat nicht die geforderte Java-Entry-Point-Signatur (`public static void main(String[] args)`), dadurch startet die Applikation typischerweise nicht über den normalen Programmstart.\n\n### Suggestion\n- Für `nofSolutions`: Überlege dir, wie du deine `solved`-Backtracking-Idee so abänderst, dass du nicht beim ersten Erfolg zurückkehrst, sondern alle gültigen Fortsetzungen weiter verfolgst und dabei mitzählt; wichtig ist auch, dass du nach jedem Versuch das Feld wieder leer machst und dass du beim Zählen die `MAX`-Grenze respektierst (z.B. indem du “verbleibendes max” in die Rekursion mitgibst).\n- Für `main`: Prüfe, welche Methodensignatur Java als Startpunkt erwartet, und passe die Sichtbarkeit (`public`) sowie `static` und den Parameter-Typ entsprechend an.\n\n### Code Style\n- In `solved(...)` machst du `model.clear(row, col)` sowohl im `else`-Zweig der Rekursion als auch nochmal im `else` von `checker.oneOK`; das ist funktional nicht schlimm, aber redundant und macht den Kontrollfluss schwerer zu lesen.\n- Du hast viele TODO-/Frage-Kommentare im Code gelassen (z.B. “Was nützt mir boolean?”). Die sind fürs Nachdenken ok, aber für die Abgabe würde ich sie entfernen oder in kurze, zielgerichtete Kommentare umwandeln.\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
    } ]
  }
}