AutoFeedback API

Result db6a187e-4c38-4ad3-9838-7f3ac0c5c1cd

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Triangles.drawRec` zeichnest du im Basisfall (`n == 0`) die dritte Kante anders als die beiden anderen: du verwendest `g.drawLine(x0, y0, x2, y2)` statt die letzte Seite konsequent als Verbindung zwischen dem dritten und dem ersten Punkt (also „zurück zum Startpunkt“) zu zeichnen.\n- In `Triangles.drawRec` sind bei den rekursiven Aufrufen die berechneten Mittelpunkte nicht überall korrekt: z.B. setzt du im zweiten rekursiven Dreieck den dritten Punkt auf `((x1 + x2) / 2, y1)` – hier wird `y` nicht als Mittelpunkt von `y1` und `y2` berechnet, sondern fix auf `y1` gesetzt, was die Geometrie verfälscht.\n\n### Suggestion\n- Schau dir im Basisfall an, welche drei Strecken ein Dreieck schließen müssen: es sollten genau die drei Kanten zwischen (0–1), (1–2) und (2–0) sein. Prüfe, ob deine dritte Linie wirklich die „fehlende“ Kante ist.\n- Berechne für die Rekursion die drei Seiten-Mittelpunkte jeweils als Mittelwert beider Koordinaten (x **und** y) der passenden Eckpunkte. Wenn du die drei Mittelpunkte einmal sauber definiert hast, nutze diese dann in den drei rekursiven Aufrufen (jeweils „Ecke + zwei passende Mittelpunkte“).\n\n### Code Style\n- In `Triangles.drawRec` rechnest du dieselben Mittelwerte mehrfach direkt in den Argumenten aus; lesbarer und weniger fehleranfällig wäre es, die Mittelpunkte einmal in Variablen zwischenzuspeichern (wie du es gedanklich schon machst).\n- In `Boxes.drawRec` mischst du Rekursion und direkte Ausgabe (`g.drawRect(...)`) für das linke untere Quadrat; das ist okay, aber für Konsistenz/Lesbarkeit könntest du entweder alles rekursiv oder alles mit einer klaren Regel machen (z.B. auch dort einen rekursiven Call mit Basisfall).\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `KnapsackN` verwendest du `maxN = 1`; damit testest du nicht den geforderten Fall „n gleiche Gegenstände“ (z.B. `n=3`) und bekommst entsprechend nicht das erwartete Verhalten/Testergebnisse für diese Aufgabe.\n\n### Suggestion\n- Setze in `KnapsackN` beim Erzeugen von `KnapsackImpl` ein `maxN > 1` (wie in der Aufgabenbeschreibung), damit du wirklich prüfst, ob dein Algorithmus Mehrfachmitnahme korrekt abdeckt und die mitgelieferten Tests dafür grün werden.\n\n### Code Style\n- `Logger log` sowie die Imports (`org.slf4j.*`) werden nirgends verwendet; entferne sie, um die Lösung schlank zu halten.\n- In `pack` entlädst du immer `maxN`-mal, auch wenn du wegen `currWeight <= maxWeight` evtl. weniger als `maxN`-mal geladen hast; das ist zwar in vielen Fällen durch den Ablauf „trotzdem korrekt“ abgefangen, aber schwer nachvollziehbar. Besser lesbar wäre es, die Anzahl tatsächlich geladener Items mitzuzählen und genau so oft wieder zu entladen.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, damit wird keine Lösung gefunden und das Board wird nie korrekt befüllt.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl der Lösungen nie korrekt gezählt.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise vorgeht (eine Dame pro Zeile), pro Spalte testet (`checkPlacement`), setzt, rekursiv die nächste Zeile löst und bei Misserfolg wieder zurücksetzt (Backtracking).\n- Für `count()`: Nutze eine ähnliche Rekursion wie bei `solve()`, aber statt beim ersten Fund abzubrechen summierst du alle vollständigen Platzierungen auf (Basisfall: wenn alle Zeilen behandelt sind, zählt das als 1 Lösung).\n\n### Code Style\n- In `Queens.java` ist `main()` nicht als Java-Entry-Point deklariert (`static void main(String[] args)`), dadurch startet das Programm in einer normalen Java-Umgebung nicht direkt.\n- In `getBoard()` ist `return this.board;` funktional ok, aber `this.` ist hier nicht nötig und wird in den anderen Klassen auch nicht konsequent verwendet.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, both required methods are not implemented: `solved(model, int fieldNr)` always returns `false` and `nofSolutions(model, int fieldNr, int max)` always returns `0`, so the solver never finds a solution and never counts any solutions.\n- The `solved(SudokuModel model)` contract says: if no solution is found, the model must be reset to its initial state. With the current placeholder implementation you don’t ensure this behavior.\n- In `Sudoku.java`, your `main` method signature is wrong (`void main()` instead of `public static void main(String[] args)`), so the program won’t start as intended.\n\n### Suggestion\n- For `solved(...)`: think in terms of backtracking over a linear index `fieldNr` from `0` to `size*size - 1`, compute `(i, j)` from it, skip fields that are already filled, and for empty fields try values `1..size()` while checking validity with `checker.oneOK(...)`. If a tried value doesn’t lead to a solution, undo it (clear) before trying the next.\n- For the “reset to initial state” requirement: make sure every value you set during search gets cleared again when you backtrack out of that path (and if the whole search fails, all tentative assignments have been undone).\n- For `nofSolutions(...)`: it’s the same recursion as `solved(...)`, but instead of stopping at the first success you accumulate counts. Use the `max` parameter to stop exploring once you have already found enough solutions.\n- For `Sudoku.java`: adjust the `main` signature to the Java entry point form so the GUI can be launched by the runtime.\n\n### Code Style\n- `// TODO implement` placeholders are still present in `SudokuSolverImpl`; remove them once you’ve implemented the logic.\n",
    "status" : "SUCCESS"
  },
  "unitTest" : {
    "tests" : [ {
      "name" : "allZero()",
      "status" : "FAILED",
      "message" : "Error occurred in server thread; nested exception is: \n\tjava.lang.NoClassDefFoundError: org/slf4j/LoggerFactory"
    }, {
      "name" : "uselessStuff()",
      "status" : "FAILED",
      "message" : "Error occurred in server thread; nested exception is: \n\tjava.lang.NoClassDefFoundError: org/slf4j/LoggerFactory"
    }, {
      "name" : "random1()",
      "status" : "FAILED",
      "message" : "Error occurred in server thread; nested exception is: \n\tjava.lang.NoClassDefFoundError: org/slf4j/LoggerFactory"
    }, {
      "name" : "random2()",
      "status" : "FAILED",
      "message" : "Error occurred in server thread; nested exception is: \n\tjava.lang.NoClassDefFoundError: org/slf4j/LoggerFactory"
    }, {
      "name" : "random3()",
      "status" : "FAILED",
      "message" : "Error occurred in server thread; nested exception is: \n\tjava.lang.NoClassDefFoundError: org/slf4j/LoggerFactory"
    }, {
      "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
    } ]
  }
}