AutoFeedback API

Result 396663bf-124a-47fa-9994-c1557dedd8d4

{
  "llm" : {
    "feedback" : "Exercise: fractal\n\n## 1. Correctness\n- Du hast die beiden geforderten `draw`-Methoden in `Boxes` und `Triangles` (bzw. deren rekursive Helfer `drawRec`) nicht implementiert; damit werden keine Formen gezeichnet und die Aufgabenanforderung ist nicht erfüllt.\n\n## 2. Suggestion\n- Fang bei beiden Klassen mit einem klaren Rekursionsabbruch an (z.B. wenn `n == 0`), und zeichne in diesem Fall nur die aktuelle Grundform (bei `Boxes` ein Rechteck, bei `Triangles` ein Dreieck).\n- Danach: reduziere `n` und berechne die Parameter für die Teilformen (Position/Größe bzw. die neuen Eckpunkte) und rufe `drawRec` für jede Teilform erneut auf.\n- Bei `Boxes`: Überlege dir, wie du aus einem Quadrat mit Seite `s` mehrere kleinere Quadrate ableitest (typisch: Ecken/Quadranten oder „Rahmen“-Muster) und wie groß diese jeweils sein sollen.\n- Bei `Triangles`: Zeichne zuerst das Dreieck über die drei Linien, dann berechne sinnvolle „Unterdreiecke“ (z.B. über Mittelpunkte der Kanten) und rufe die Rekursion auf diesen Teil-Dreiecken auf.\n\n## 3. Code Style\n- Lass die `// TODO implement` Kommentare erst stehen, wenn du wirklich noch daran arbeitest; sobald implementiert, entferne/aktualisiere sie, damit klar ist, was fertig ist.\n\n\nExercise: knapsack\n\n### 1. Correctness\n- In `KnapsackImpl` sind `pack(int i)`, `packItem(int i)` und `unpackItem(int i)` nicht implementiert; damit kann `solve()` kein korrektes Optimum berechnen und die Tests werden scheitern.\n- Die Anforderung „Gegenstände bis zu n‑Mal mitnehmen“ wird aktuell nicht umgesetzt, da die Logik dafür (mehrfaches Packen pro Item) vollständig fehlt.\n\n### 2. Suggestion\n- Überlege dir für `pack(i)` eine rekursive/iterative Struktur, die für jedes Item nicht nur „0 oder 1“, sondern „0 bis maxN“ Varianten durchprobiert, bevor sie zum nächsten Item weitergeht.\n- Achte darauf, dass du bei der Rekursion einen sinnvollen Abbruchfall brauchst (z.B. wenn `i` am Ende der Item-Liste ist) und dort `maxValue` aktualisierst, falls das aktuelle Paket besser ist und das Gewicht passt.\n- In `packItem(i)` solltest du die aktuellen Summen (`currWeight`, `currValue`) passend zum Item erhöhen; in `unpackItem(i)` musst du den vorherigen Zustand wiederherstellen, passend dazu, wie oft du dieses Item in deinem Durchlauf hinzugefügt hast.\n\n### 3. Code Style\n- Die TODO-Kommentare sind okay als Platzhalter, aber solange die Methoden leer sind, wirkt die Abgabe unvollständig; implementiere zumindest die Kernmethoden, damit man den Ansatz nachvollziehen kann.\n\n\nExercise: queens\n\n## 1. Correctness\n- `solve()` ist nicht implementiert und liefert immer `false`, damit wird nie eine Lösung auf dem Board platziert.\n- `count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl Lösungen nicht gezählt.\n\n## 2. Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise (oder spaltenweise) genau eine Dame setzt, jeweils alle Spalten ausprobiert, mit `checkPlacement(row, col)` prüft, und bei Fehlschlag die gesetzte Dame wieder entfernt (Backtracking).\n- Für `count()`: Nutze eine sehr ähnliche Rekursion wie bei `solve()`, aber statt beim ersten Treffer abzubrechen, summierst du alle vollständigen Platzierungen auf und gibst die Summe zurück; auch hier nach jedem Versuch wieder “undo” machen.\n\n## 3. Code Style\n- In `BoardPrinter`: `if (board[row][col] == true)` ist unnötig ausführlich; ein direkter Boolean-Check ist lesbarer.\n- In `QueensSolver`: Die `// TODO implement` Kommentare sind okay, aber sobald du implementierst, achte darauf, Hilfsmethoden (z.B. rekursiver Worker) sinnvoll privat auszulagern, damit `solve()`/`count()` kurz und übersichtlich bleiben.\n\n\nExercise: sudoku\n\n1. Correctness\n- `solved(SudokuModel model)` erfüllt die Anforderung nicht: aktuell wird immer `false` zurückgegeben und das Model wird nicht gelöst.\n- Die Hilfsmethode `solved(SudokuModel model, int fieldNr)` ist nicht implementiert, dadurch gibt es kein Backtracking und keine Suche nach einer Lösung.\n- `nofSolutions(SudokuModel model)` erfüllt die Anforderung nicht: aktuell wird immer `0` zurückgegeben und es werden keine Lösungen gezählt.\n- Die Hilfsmethode `nofSolutions(SudokuModel model, int fieldNr, int max)` ist nicht implementiert, dadurch wird weder gezählt noch bei `MAX` abgebrochen.\n- Für beide Methoden fehlt das geforderte Verhalten “Model wird bei Misserfolg bzw. nach dem Zählen auf den Ausgangszustand zurückgesetzt”.\n\n2. Suggestion\n- Überlege dir für `fieldNr`, wie du daraus deterministisch `(i, j)` berechnest (z.B. über Division/Modulo mit `model.size()`), damit du Feld für Feld durchgehst.\n- Baue einen Abbruchfall ein: Was bedeutet es, wenn `fieldNr` “hinter dem letzten Feld” ist? (Das ist typischerweise der Moment, wo du eine komplette Lösung hast.)\n- Wenn ein Feld schon belegt ist (`get(i,j) != 0`), solltest du bei `solved`/`nofSolutions` ohne Änderungen direkt mit dem nächsten Feld weitermachen.\n- Wenn ein Feld leer ist: iteriere mögliche Werte `1..size()`, setze testweise, prüfe mit `checker.oneOK(...)` ob der Schritt gültig ist, und gehe dann rekursiv weiter; wenn es nicht klappt, Feld wieder leeren (Backtracking-Schritt).\n- Für `nofSolutions`: statt beim ersten Treffer `true` zurückzugeben, solltest du bei einem vollständigen Sudoku den Zähler erhöhen und dann weiter suchen (bis `max` erreicht ist). Achte darauf, dass du beim Zurückgehen immer sauber “aufräumst” (Feld wieder leeren), sonst verfälscht das weitere Zählen.\n- Um “Model zurücksetzen” sicherzustellen: denke darüber nach, wie du den Startzustand festhältst (oder wie du durch konsequentes Backtracking garantierst, dass am Ende wieder alles wie vorher ist), insbesondere bei `nofSolutions`, wo du am Ende *immer* zurück auf Start musst.\n\n3. Code Style\n- In `SudokuSolverImpl` stehen noch `// TODO implement`-Platzhalter; sobald du implementierst, entferne sie oder ersetze sie durch kurze, aussagekräftige Kommentare zur Rekursionslogik.\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: <0>"
    }, {
      "name" : "random2()",
      "status" : "FAILED",
      "message" : "expected: <340> but was: <0>"
    }, {
      "name" : "random3()",
      "status" : "FAILED",
      "message" : "expected: <558> but was: <0>"
    } ]
  }
}