AutoFeedback API

Result 961f6959-9421-4861-a3ce-8d9b0367fda8

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` fehlt ein sauberer Abbruchfall für `n == 0`: Du zeichnest aktuell **bei jedem Rekursionsschritt** ein Rechteck und gehst dann weiter runter, statt erst bei der Basisstufe zu zeichnen (dadurch entsteht nicht die geforderte Fraktal-Struktur wie in der Aufgabenidee).\n- In `Boxes.drawRec` zeichnest du nur drei Teilquadrate (oben links, oben rechts, unten rechts), aber **kein** Quadrat unten links; damit entspricht die rekursive Aufteilung nicht der erwarteten Form.\n- In `Triangles.drawRec` fehlt ebenfalls ein Basisfall `n == 0`, in dem **nur** das Dreieck gezeichnet wird; aktuell zeichnest du das Dreieck in jedem Schritt und rekursierst weiter, wodurch mehr Linien entstehen als vorgesehen und das Muster nicht passt.\n\n### Suggestion\n- Überlege dir für beide Formen: „Was soll bei `n == 0` passieren?“ und „Was soll bei `n > 0` passieren?“—und setze das als klare `if/else`-Struktur um.\n- Bei den Boxes: Wenn du das Quadrat in vier gleich grosse Quadranten teilst, prüfe, ob du für **alle vier Positionen** (inkl. unten links) entweder rekursiv zeichnest oder (falls es „immer“ gefüllt sein soll) zumindest dort noch ein Quadrat zeichnest.\n- Bei den Triangles: Zeichne das Dreieck nur im Basisfall und berechne bei `n > 0` erst die Mittelpunkte der drei Seiten; nutze dann diese Punkte, um die 3 kleineren Dreiecke korrekt aufzuspannen, bevor du rekursiv weitergehst.\n\n### Code Style\n- Die Bedingung `if (n < 0) return;` ist als Rekursions-Abbruch unüblich in dieser Aufgabe; lesbarer/typischer ist eine explizite Basisfall-Prüfung auf `n == 0` (und ein `else` für den Rekursionsfall).\n- In `Boxes.drawRec` überschreibst du den Parameter `s` (`s = s / 2;`), was das Nachvollziehen der ursprünglichen Seitenlänge erschwert; nutze dafür lieber eine neue Variable (z.B. `half`), damit klar bleibt, was „Original“ und was „geteilt“ ist.\n- Auskommentierter Code in `Triangles` (`//drawRec(...)`) kann entfernt werden, sobald du dich für den finalen Ansatz entschieden hast.\n\n\n# Exercise: knapsack\n\n### Correctness\n- Deine `pack`-Logik berücksichtigt `maxN` nicht: aktuell kannst du jeden Gegenstand nur 0x oder 1x einpacken, gefordert ist aber bis zu `n`-mal pro Gegenstand.\n- Dadurch liefern die Tests für „n gleiche Gegenstände“ sehr wahrscheinlich falsche Optima, weil Kombinationen mit 2x/3x/... desselben Items nie betrachtet werden.\n\n### Suggestion\n- Überlege dir für jedes Item nicht nur zwei Fälle (nehmen/nicht nehmen), sondern mehrere Varianten: „0 Stück“, „1 Stück“, …, „maxN Stück“ – und wie du diese Varianten rekursiv durchprobieren kannst.\n- Achte darauf, dass du nach dem Durchprobieren eines Items den Zustand (`currWeight`, `currValue`) wieder vollständig zurücksetzt (wenn du ein Item mehrfach eingeladen hast, musst du auch entsprechend mehrfach bzw. gesammelt wieder ausladen).\n\n### Code Style\n- In `KnapsackN` hat `main()` nicht die übliche Signatur `main(String[] args)`; das ist zwar evtl. in der Vorlage so, aber es kann verwirren/zu Laufproblemen führen, falls man es direkt starten will.\n- Die `// TODO implement`-Kommentare in Methoden, die du bereits implementiert hast (`pack`, `loadItem`, `unloadItem`), kannst du entfernen, damit klar ist, was noch offen ist.\n\n\n# Exercise: sudoku\n\n### Correctness\n- `Sudoku.main()` hat nicht die Java-Entry-Point-Signatur (`public static void main(String[] args)`), dadurch startet die Applikation so nicht wie vorgesehen.\n- `SudokuModel#set` wurde im Interface von `void set(...)` auf `boolean set(...)` geändert; das bricht die vorgegebene Schnittstelle und passt nicht mehr zu anderen Klassen, die das Interface erwarten.\n- `SudokuModelImpl#set` gibt immer `false` zurück, unabhängig davon ob gesetzt wurde; selbst wenn das kompilieren würde, wäre die Semantik damit inkonsistent.\n- In `SudokuSolverImpl.solved(...)`: Wenn ein Feld bereits belegt ist (`model.get(row,col) != 0`), rufst du rekursiv `solved(model, fieldNr + 1)` auf, aber du gibst das Ergebnis nicht zurück. Dadurch läuft die Methode danach trotzdem in die Schleife und überschreibt vorgegebene Werte (und kann falsche Ergebnisse liefern).\n- `nofSolutions(...)` ist nicht implementiert und liefert immer `0`, damit wird die Anforderung “Anzahl Lösungen zählen” nicht erfüllt.\n\n### Suggestion\n- Schau dir beim Startpunkt an, welche `main`-Methode die JVM wirklich als Einstieg akzeptiert (Stichworte: `public`, `static`, Parameter `String[]`).\n- Änder die Signatur von `SudokuModel#set` nicht: die restliche Vorlage (GUI/Sample/Checker/Solver) ist auf die ursprüngliche Methode ausgelegt; wenn du hier den Rückgabetyp anpasst, musst du *alles* anpassen.\n- Beim “Feld ist schon vorgegeben”-Fall in `solved`: Überleg dir, was die Funktion in diesem Fall *zurückgeben* soll, und was danach noch passieren darf. Typischerweise darfst du das Feld dann nicht mehr neu setzen.\n- Für `nofSolutions`: Übernimm gedanklich die gleiche Rekursionsstruktur wie beim Lösen, aber statt beim ersten Fund zu stoppen, addierst du die gefundenen Lösungen auf und brichst ab, sobald du `MAX` erreicht hast. Achte dabei darauf, dass das Modell nach dem Zählen wieder im Ausgangszustand ist (Backtracking/`clear` am richtigen Ort).\n\n### Code Style\n- Viele auskommentierte “TODO-/Gedanken”-Kommentare in `solved` sind für dich beim Entwickeln ok, aber fürs Abgeben besser entfernen oder in kurze, präzise Kommentare umwandeln.\n- Vermeide Magic Numbers wie `81` und `9` direkt im Code; nutze dafür `model.size()` (und `model.size()*model.size()`), damit es konsistent zur Modell-API bleibt.\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
    } ]
  }
}