AutoFeedback API

Result 01fd2305-b6ef-4513-8483-8d42afd6b212

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec(...)` zeichnest du bei `n > 0` alle vier Quadranten rekursiv; in der geforderten Boxen-Fraktal-Variante bleibt aber ein Teil “direkt” (Basisfall) statt weiter rekursiv zu gehen (dadurch entsteht ein anderes Muster als erwartet).\n- In `Triangles.drawRec(...)` zerlegst du das Dreieck in drei Teil-Dreiecke, aber die von dir verwendeten Punktkombinationen entsprechen nicht der üblichen Sierpinski-Aufteilung (die drei rekursiven Dreiecke sollten über die Seitenmittelpunkte definiert sein); so entsteht eine andere Geometrie als die erwartete Form.\n\n### Suggestion\n- Boxes: Überlege dir, ob wirklich **alle** vier Sub-Quadrate nochmals “gleich tief” rekursiv weitergehen sollen. Schau dir an, welcher Quadrant im Muster “anders” behandelt werden müsste (z.B. einmalig nur als Quadrat zeichnen), und wie du das über einen Aufruf mit einem anderen `n` oder direktes Zeichnen ausdrücken kannst.\n- Triangles: Berechne explizit die **drei Seitenmittelpunkte** (zwischen (x0,y0)-(x1,y1), (x0,y0)-(x2,y2), (x1,y1)-(x2,y2)) und baue daraus die drei rekursiven Dreiecke. Prüfe dann pro rekursivem Aufruf: Werden die Eckpunkte wirklich so gewählt, dass jedes Kind-Dreieck exakt eine “Ecke” des großen Dreiecks plus die passenden zwei Mittelpunke bekommt?\n\n### Code Style\n- In `Triangles.drawRec(...)` ist das `return;` nach dem Basisfall nicht nötig, weil der `else`-Zweig ohnehin getrennt ist; das macht den Code minimal unruhiger.\n- In beiden Klassen könntest du wiederverwendete Ausdrücke (z.B. die Midpoints) in gut benannte Variablen auslagern (bei Triangles besonders), damit man die Geometrie leichter nachvollziehen kann.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `KnapsackN.main()` hat keine korrekte Java-Signatur für einen Programmstartpunkt; so wird das Programm typischerweise nicht als `main` erkannt (Tests/Runner könnten das erwarten).\n\n### Suggestion\n- Schau dir an, welche `main`-Methoden-Signatur die JVM als Einstiegspunkt akzeptiert, und passe die Methode in `KnapsackN` entsprechend an (Parameterliste/Modifiers).\n\n### Code Style\n- In `pack(int i)` sind die verschachtelten Schleifen (k-mal laden/entladen) etwas schwer zu lesen; überlege, ob du das Laden/Entladen für „k Stück“ als eigene Hilfsmethode ausdrücken kannst, um Doppelcode zu vermeiden.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `Sudoku.java` ist `main()` nicht `public static void main(String[] args)`, dadurch startet die Applikation nicht wie erwartet.\n- In `solved(...)` setzt du beim Backtracking ein Feld mit `model.set(row, col, 0)` zurück; laut `SudokuModel` ist `0` bei `set()` nicht erlaubt (0 geht nur über `clear()`), das führt zu einer Exception.\n- In `solved(...)` wird das Modell bei “keine Lösung” nicht garantiert auf den Ursprungszustand zurückgesetzt (Anforderung: bei `false` muss das Sudoku wieder im Initialzustand sein).\n- In `nofSolutions(...)` setzt du ebenfalls mit `model.set(row, col, 0)` zurück (gleiches Problem: `set` erlaubt kein 0).\n- In `nofSolutions(...)` wird das Modell am Ende nicht zuverlässig auf den Initialzustand zurückgesetzt (Anforderung: “The model was reset to its initial state.”).\n\n### Suggestion\n- Schau dir die Java-Signatur an, die die JVM als Einstiegspunkt akzeptiert, und passe deine `main`-Methode entsprechend an.\n- Für das Zurücksetzen eines Feldes auf “leer” verwende die dafür vorgesehene Model-Operation (die Schnittstelle unterscheidet explizit zwischen “set value” und “clear”).\n- Damit das Modell bei einem Fehlschlag wieder exakt so aussieht wie vor dem Aufruf von `solved`, überlege dir eine Strategie, wie du jede von dir gemachte Änderung wieder rückgängig machst (typisch: nur selbst-gesetzte Felder zurücknehmen; vorgegebene nie verändern).\n- Für `nofSolutions`: Achte darauf, dass du am Ende jedes Rekursionszweigs den gesetzten Kandidaten wieder entfernst (auch bei frühem Abbruch wegen `max`), sodass nach dem gesamten Zählprozess der Anfangszustand wiederhergestellt ist.\n\n### Code Style\n- In `SudokuSolverImpl` sind die Konstanten `81` und `9` hardcodiert; nutze besser `model.size()` (und daraus `size*size`), damit der Code nicht “magisch” wirkt und konsistent zur Modell-API bleibt.\n- In `solved(...)` prüfst du jedes Mal `checker.allOK(model)`; das ist sehr teuer und unnötig, wenn du nur das neu gesetzte Feld validieren willst (die API bietet dafür eine passendere Methode).\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
    } ]
  }
}