AutoFeedback API

Result 2bedb169-5500-4997-a4c5-8117a3cf1e01

{
  "llm" : {
    "feedback" : "Exercise: fractal\n\n## 1. Correctness\n- Die beiden geforderten `draw`-Implementationen fehlen: In `Boxes.drawRec(...)` und `Triangles.drawRec(...)` ist noch `// TODO implement`, dadurch werden keine Formen gezeichnet und die Aufgabe ist nicht erfüllt.\n\n## 2. Suggestion\n- Implementiere in beiden `drawRec`-Methoden zuerst einen klaren Rekursions-Abbruch (z.B. wenn `n` eine bestimmte Grenze erreicht), damit die Rekursion endet.\n- In `Boxes.drawRec(...)`: Zeichne pro Rekursionsschritt zuerst das aktuelle Rechteck mit `g.drawRect(...)` und berechne dann die Parameter (Position/Grösse) für die nächsten, kleineren Rechtecke, die rekursiv gezeichnet werden sollen.\n- In `Triangles.drawRec(...)`: Zeichne pro Schritt das Dreieck mit drei `g.drawLine(...)`-Aufrufen (zwischen den drei Punkten) und bestimme danach die Punkte für die nächsten, kleineren Dreiecke (typisch über Mittelpunkte der Kanten), bevor du rekursiv weiterzeichnest.\n\n## 3. Code Style\n- Die TODO-Kommentare sind noch vorhanden; sobald du implementierst, entferne/ersetze sie, damit klar ist, was finaler Code ist.\n\n\nExercise: knapsack\n\n### 1. Correctness\n- \n\n### 2. Suggestion\n- \n\n### 3. Code Style\n- \n\n\nExercise: queens\n\n## 1. Correctness\n- `solve()` ist nicht implementiert und liefert immer `false`, damit wird keine Lösung per Backtracking gesucht/gefunden.\n- `count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl der möglichen Lösungen nicht gezählt.\n\n## 2. Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise (oder spaltenweise) versucht, genau eine Dame zu setzen, und bei Konflikten wieder zurücksetzt (Undo), bis entweder alle Reihen belegt sind (Erfolg) oder alle Möglichkeiten ausgeschöpft sind (Misserfolg).\n- Nutze `checkPlacement(row, col)` um zu entscheiden, ob du an einer Position eine Dame setzen darfst, und denke daran, dass du beim Backtracking das Feld wieder auf `false` setzen musst.\n- Für `count()`: Ähnlich wie bei `solve()`, aber statt beim ersten Treffer abzubrechen, zählst du jeden vollständigen gültigen Zustand als 1 und summierst die Ergebnisse der rekursiven Aufrufe.\n\n## 3. Code Style\n- In `BoardPrinter`: `if (board[row][col] == true)` ist unnötig ausführlich; ein direkter boolean-Check wäre lesbarer.\n- Optional zur Lesbarkeit: Kommentare/Helper-Methoden für den rekursiven Teil (z.B. `solveFromRow(int row)` / `countFromRow(int row)`) statt alles in `solve()`/`count()` zu packen.\n\n\nExercise: sudoku\n\n### 1. Correctness\n- `solved(SudokuModel model)` bzw. die rekursive Hilfsmethode ist nicht implementiert und liefert immer `false`; damit wird nie ein Sudoku gelöst und das Modell nie entsprechend befüllt.\n- `nofSolutions(SudokuModel model)` bzw. die rekursive Hilfsmethode ist nicht implementiert und liefert immer `0`; damit wird die Anzahl Lösungen nie korrekt gezählt (und auch das geforderte Abbrechen bei `MAX` wird nicht umgesetzt).\n- Für den Fall „keine Lösung“ verlangt das Interface, dass das Modell auf den Initialzustand zurückgesetzt wird; aktuell passiert das nicht (weil die Logik fehlt).\n\n### 2. Suggestion\n- Für `solved`: Überlege dir eine Backtracking-Rekursion, die ein Feld nach dem anderen (über `fieldNr`) abarbeitet: wenn das Feld schon belegt ist, gehe zum nächsten; wenn es leer ist, probiere Kandidaten `1..size()`, setze testweise, prüfe mit `checker.oneOK(...)`, und rufe dann rekursiv für das nächste Feld auf; bei Fehlschlag wieder `clear(...)`.\n- Achte auf den Rekursionsabbruch: Wenn `fieldNr` am Ende angekommen ist, muss das bedeuten „alles belegt und gültig“ → Lösung gefunden.\n- Für das Reset bei „nicht solved“: Du brauchst eine Möglichkeit, nach erfolglosen Versuchen alle von dir gesetzten Felder wieder zu entfernen, ohne die vorgegebenen Zahlen kaputt zu machen (z.B. durch konsequentes Zurücksetzen beim Backtracking und/oder indem du den Ausgangszustand separat rekonstruieren kannst).\n- Für `nofSolutions`: Nutze eine sehr ähnliche Rekursion wie beim Lösen, aber statt beim ersten Fund sofort `true` zurückzugeben, zählst du Lösungen hoch; bei jeder vollständigen Belegung erhöhst du den Zähler.\n- Denk daran, die Suche frühzeitig zu stoppen, sobald `max` (bzw. `MAX`) erreicht ist; dafür muss der rekursive Rückgabewert/Parameter so gewählt sein, dass du das Abbrechen nach oben propagieren kannst.\n- Da `nofSolutions` garantiert, dass das Modell am Ende wieder im Initialzustand ist: Stelle sicher, dass nach jedem gesetzten Kandidaten ein passendes `clear(...)` passiert, auch wenn du eine Lösung gefunden hast.\n\n### 3. Code Style\n- In `SudokuSolverImpl` stehen noch `// TODO implement`-Marker und Dummy-Returns; wenn du implementierst, entferne diese Platzhalter bzw. ersetze sie durch sinnvolle Logik, damit der Code nicht wie ein Stub wirkt.\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
    } ]
  }
}