AutoFeedback API

Result b7f0448a-a391-4deb-bb67-7400c28bd363

{
  "llm" : {
    "feedback" : "Exercise: fractal\n\n1. Correctness\n- Du hast die beiden geforderten `draw`-Implementationen noch nicht umgesetzt: In `Boxes.drawRec(...)` und `Triangles.drawRec(...)` steht weiterhin nur `// TODO`, dadurch werden weder Boxen noch Dreiecke gezeichnet.\n- Damit erfüllst du die Anforderung „Implementiere die beiden `draw` methoden in den Klassen `Boxes` und `Triangles`“ aktuell nicht.\n\n2. Suggestion\n- Fang in beiden rekursiven Methoden mit einem klaren Abbruchfall an (z.B. wenn `n == 0`), damit die Rekursion stoppt.\n- In `Boxes`: Zeichne zuerst das aktuelle Rechteck mit `g.drawRect(...)` und berechne dann für die rekursiven Aufrufe neue Koordinaten/Grössen (typisch: kleinere Quadrate/Boxen an bestimmten Positionen innerhalb/um das aktuelle Rechteck).\n- In `Triangles`: Zeichne zuerst das aktuelle Dreieck, indem du mit `g.drawLine(...)` die drei Kanten verbindest (je zwei der Punkte). Für die Rekursion bietet es sich an, aus den drei Eckpunkten Mittelpunkte der Seiten zu berechnen und damit kleinere Dreiecke zu definieren.\n- Achte darauf, bei jedem rekursiven Aufruf `n` zu reduzieren, sonst endet die Rekursion nicht.\n\n3. Code Style\n- In `Shape` ist `public` bei Interface-Methoden redundant (Interface-Methoden sind implizit `public`); du kannst es weglassen, um es idiomatischer zu machen.\n- Die `// TODO implement` Kommentare sind okay während der Arbeit, aber sobald du fertig bist, sollten sie entfernt/ersetzt werden, damit klar ist, dass die Aufgabe gelöst ist.\n\n\nExercise: knapsack\n\n1. Correctness\n\n2. Suggestion\n\n3. Code Style\n- In `pack(...)` ist die Verschachtelung der `if`-Blöcke recht tief; du könntest die Lesbarkeit verbessern, indem du mit frühen `return`s arbeitest (z.B. bei Abbruchbedingungen wie `i >= weights.length` oder `currWeight > maxWeight`).\n\n\nExercise: queens\n\n## 1. Correctness\n- `solve()` ist nicht implementiert und gibt immer `false` zurück; damit wird keine Lösung gesucht/platziert, obwohl die Aufgabe eine Backtracking-Lösung verlangt.\n- `count()` ist nicht implementiert und gibt immer `0` zurück; damit wird die Anzahl möglicher Lösungen nicht gezählt, wie in der Aufgabe gefordert.\n\n## 2. Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise (oder spaltenweise) genau eine Dame setzt, vor dem Setzen mit `checkPlacement(...)` prüft und bei einem Fehlschlag die gesetzte Dame wieder entfernt (Backtracking). Sobald du in der letzten Zeile angekommen bist, kannst du “gelöst” zurückmelden.\n- Für `count()`: Verwende eine ähnliche Rekursion wie bei `solve()`, aber statt beim ersten Fund abzubrechen, zählst du jede vollständige Platzierung als `+1` und summierst alle Teilergebnisse über alle möglichen Spaltenpositionen pro Zeile.\n- Achte darauf, dass du beim Probieren einer Position das Board korrekt mutierst (setzen) und nach dem rekursiven Aufruf wieder zurücksetzt (löschen), sonst beeinflussen frühere Versuche spätere Zählungen/Lösungen.\n\n## 3. Code Style\n- In `BoardPrinter.printLine(...)` ist `if (board[row][col] == true)` unnötig ausführlich; ein direkter boolean-Check wäre lesbarer.\n\n\nExercise: sudoku\n\n1. Correctness\n- In `SudokuSolverImpl` sind `solved(SudokuModel model, int fieldNr)` und `nofSolutions(SudokuModel model, int fieldNr, int max)` noch nicht implementiert und liefern aktuell immer `false` bzw. `0`, damit erfüllt dein Solver die Aufgabenanforderungen nicht.\n- `solved(SudokuModel model)` muss bei “keine Lösung” das Sudoku wieder in den Anfangszustand zurücksetzen; mit der aktuellen Implementierung (immer `false` ohne Änderungen/Backtracking) ist dieses Verhalten nicht umgesetzt.\n- `nofSolutions(SudokuModel model)` muss die Anzahl Lösungen zählen (bis max. `MAX`) und danach das Modell auf den Anfangszustand zurücksetzen; aktuell wird immer `0` zurückgegeben und es findet keine Zählung/Reset statt.\n\n2. Suggestion\n- Für `solved(...)`: Überlege dir eine Rekursion über alle Felder (z.B. über `fieldNr` von 0 bis `size()*size()-1`) und berechne daraus `i/j`. Wenn ein Feld schon belegt ist, geh einfach zum nächsten weiter; wenn es leer ist, probiere Werte `1..size()` und nutze `checker.oneOK(...)`, um nur gültige Kandidaten weiterzuverfolgen. Wenn ein Kandidat nicht zum Ziel führt, musst du das Feld wieder leeren (Backtracking).\n- Für das “Reset auf Anfangszustand” bei `solved == false`: Du brauchst eine Möglichkeit, nach einem gescheiterten Suchlauf alle von dir gesetzten Werte wieder zu entfernen. Das geht z.B. indem du beim Backtracking konsequent wieder `clear` machst und am Ende sicherstellst, dass keine “Testwerte” stehen bleiben, wenn keine Lösung gefunden wurde.\n- Für `nofSolutions(...)`: Das ist im Prinzip dieselbe Suche wie beim Lösen, aber statt beim ersten Fund “true” zurückzugeben, zählst du weiter (und erhöhst einen Zähler, wenn du am Ende des Feldbereichs angekommen bist). Achte darauf, die Suche abzubrechen, sobald dein Zähler `max` erreicht, damit du die `MAX`-Anforderung erfüllst.\n- Für den Reset bei `nofSolutions`: Da du nach dem Zählen garantiert zum Anfang zurück musst, ist es besonders wichtig, dass du nach jedem ausprobierten Wert wieder sauber `clearst`, bevor du zurückkehrst.\n\n3. Code Style\n- Die `// TODO implement`-Stellen sind okay als Marker, aber solange sie drin sind, wirkt es wie “unfertig”; sobald du fertig bist, entferne sie oder ersetze sie durch kurze, beschreibende Kommentare zur Backtracking-Idee.\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
    } ]
  }
}