AutoFeedback API

Result 398e36f8-1c79-4232-aaf4-6ddbcc559baf

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Triangles.drawRec` (Basisfall `n == 0`) zeichnest du die dritte Kante mit `g.drawLine(x0, y0, x2, y2)` statt `g.drawLine(x2, y2, x0, y0)` – das ist zwar geometrisch dieselbe Linie, aber damit erfüllst du die Anforderung “drawLine(...) multiple times to draw a triangle” nur dann eindeutig, wenn wirklich alle drei Seiten (zwischen je zwei Eckpunkten) gezeichnet werden; aktuell ist es nicht konsequent “(x2,y2) -> (x0,y0)” wie die anderen beiden Kantenpaare aufgebaut sind.\n\n### Suggestion\n- Schau dir im Basisfall an, ob du wirklich die drei *verschiedenen* Kanten zwischen den Punkten (0–1), (1–2) und (2–0) zeichnest; überprüfe dabei explizit, dass jede Kante genau die beiden passenden Eckpunkte verbindet.\n\n### Code Style\n- In `Triangles.drawRec` berechnest du sehr viele Mittelpunkte inline in den Methodenaufrufen; lesbarer wird das, wenn du die Midpoints einmal in lokale Variablen packst (hilft auch beim Debuggen).\n- In `Boxes.drawRec` ist die Reihenfolge/Kommentierung der rekursiven Aufrufe etwas durcheinander (erst rechts oben/unten, dann links oben); besser wäre eine konsistente Reihenfolge (z.B. im Uhrzeigersinn), damit man die Struktur schneller erkennt.\n\n\n# Exercise: knapsack\n\n### Correctness\n\n\n### Suggestion\n\n\n### Code Style\n- In `pack`, duplikierst du den “Undo”-Schritt über `loadeditems` und eine zweite Schleife; das funktioniert, ist aber unnötig umständlich und macht die Methode schwerer zu lesen.\n- `currWeight = currWeight + ...` / `currValue = currValue + ...` ist deutlich weniger lesbar als die Kurzschreibweise; konsistentere, kompaktere Updates würden die Intention klarer machen.\n- Variablennamen sind uneinheitlich formatiert (`loadeditems` statt z.B. `loadedItems`), was in Java unüblich ist und die Lesbarkeit senkt.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, damit wird nie eine Lösung gefunden/platziert.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl Lösungen nie korrekt gezählt.\n\n### Suggestion\n- Für `solve()`: Du brauchst eine Backtracking-Strategie, die Reihe für Reihe versucht, eine Dame in einer gültigen Spalte zu setzen, und bei einem Fehlschlag wieder zurücknimmt (das Feld wieder auf `false` setzt).\n- Für `count()`: Statt beim ersten Fund abzubrechen, solltest du alle gültigen Platzierungen durchprobieren und die Anzahl der vollständigen Belegungen aufsummieren; auch hier musst du nach dem rekursiven Schritt immer wieder “undo” machen, damit die nächste Variante korrekt getestet wird.\n\n### Code Style\n- In `Queens.java` ist `main()` nicht als Java-Entry-Point deklariert (`static void main(String[] args)`), dadurch lässt sich das Programm typischerweise nicht direkt starten (auch wenn das nicht Teil der zwei TODOs ist).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `Sudoku.java` ist `main()` weder `public` noch `static` und hat keine `String[] args`-Parameter; so wird das Programm typischerweise nicht als Java-Startklasse laufen.\n- In `nofSolutions(...)` wird das Model am Ende nicht auf den initialen Zustand zurückgesetzt (bei der Anforderung steht explizit, dass das Model nach dem Zählen wieder im Ausgangszustand sein soll).\n- In `nofSolutions(...)` behandelst du das `max`-Limit nicht korrekt über die Rekursion: du gibst in die Rekursion immer das gleiche `max` weiter, statt das verbleibende Restbudget zu berücksichtigen; dadurch kann die Gesamtanzahl gefundener Lösungen `MAX` überschreiten.\n\n### Suggestion\n- Schau dir die exakte Signatur an, die eine Java-Anwendung als Einstiegspunkt braucht, und passe deine `main`-Methode entsprechend an.\n- Überlege beim Lösungszählen: Welche Felder setzt du während der Suche, und welche davon müssen nach dem Aufruf wieder gelöscht werden, damit der Zustand identisch zum Start ist? (Hinweis: nicht nur das “aktuelle” Feld, sondern auch alle Felder, die durch erfolgreiche Teilpfade gesetzt bleiben.)\n- Wenn du `MAX` als Obergrenze hast: Zähle nicht nur lokal pro Rekursionsaufruf, sondern gib in die Rekursion mit, wie viele Lösungen du “noch übrig hast”, bevor du abbrechen musst (also abhängig davon, wie viele du bereits gefunden hast).\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
    } ]
  }
}