AutoFeedback API

Result 90f5cbaf-420e-485d-a1ec-6d34de9afdb7

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec(...)` zeichnest du im rekursiven Fall kein unten-links Quadrat der halben Größe, sondern rufst stattdessen `drawRec(g, x, y, s, n-1)` auf (gleiche Position und gleiche Größe wie das aktuelle Quadrat). Dadurch entsteht nicht das geforderte 2x2-Muster (oben links, oben rechts, unten rechts, unten links), sondern eine Rekursion „auf sich selbst“ mit gleicher Geometrie.\n- `Triangles.drawRec(...)` ist nicht implementiert, obwohl die Aufgabe verlangt, beide `draw`-Methoden in `Boxes` und `Triangles` zu implementieren.\n\n### Suggestion\n- Überlege dir bei den Boxen: Wenn du ein Quadrat der Seitenlänge `s` in vier Quadranten zerlegst, welche `(x,y)`-Koordinaten hat dann der unten-linke Quadrant und welche Seitenlänge muss er haben? Vergleiche das mit deinem letzten rekursiven Aufruf („aussenrum“) – der sollte geometrisch nicht wieder das gleiche Quadrat betreffen.\n- Für die Dreiecke: Starte mit einem klaren Basisfall (`n == 0`): zeichne genau die drei Kanten mit `drawLine`. Im rekursiven Fall: Berechne die Mittelpunkte der drei Seiten und rufe dann rekursiv für die Teil-Dreiecke auf (achte darauf, dass du die „richtigen“ drei kleineren Dreiecke wählst).\n\n### Code Style\n- In `Boxes.drawRec(...)` wären klarere, konsistente Kommentare/Benennungen hilfreich (z.B. einheitlich „rechts unten“ statt „recht unten“, und keine Mischung aus „aussenrum“ vs. Quadranten).\n- Die Reihenfolge deiner rekursiven Aufrufe in `Boxes` ist etwas schwer nachzuvollziehen; gruppiere sie ggf. logisch (z.B. im Uhrzeigersinn) und halte die Struktur symmetrisch, damit man das Muster leichter erkennt.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `pack(int i)` ist nicht implementiert; damit wird nie eine Kombination ausprobiert und `solve()` liefert immer `0` statt dem optimalen Wert.\n- `loadItem(int i)` und `unloadItem(int i)` sind nicht implementiert; ohne diese Zustandsänderungen (Gewicht/Wert erhöhen bzw. zurücksetzen) kann die Rekursion nicht korrekt arbeiten.\n- In `KnapsackN` hat `main()` die falsche Signatur (`static void main()` statt `static void main(String[] args)`); so lässt sich das Programm nicht wie erwartet starten.\n\n### Suggestion\n- Überlege dir für `pack(i)` eine Rekursionsstruktur mit Abbruchfall: Was soll passieren, wenn `i == weights.length` erreicht ist, und wann wird `maxValue` aktualisiert?\n- Für jedes Item `i` brauchst du die Varianten „0 Stück“, „1 Stück“, …, „maxN Stück“ im Rucksack. Tipp: Das lässt sich als Schleife innerhalb des Rekursionsschritts ausdrücken, wobei du nach jedem Hinzufügen wieder rekursiv zum nächsten Index gehst.\n- Achte darauf, dass nach dem Ausprobieren mehrerer Stücke eines Items der Zustand (`currWeight`, `currValue`) wieder exakt auf den Stand vor dem Item zurückgesetzt wird (sonst „schleppt“ die Rekursion Werte in andere Zweige).\n- Prüfe in `pack(i)` frühzeitig, ob `currWeight > maxWeight` ist, damit du ungültige Zweige gar nicht weiter verfolgst.\n- Passe die `main`-Methode so an, dass sie von der JVM als Einstiegspunkt erkannt wird.\n\n### Code Style\n- Die Methodennamen sind inkonsistent zur Aufgaben-/Vorlagenlogik: Du hast `loadItem/unloadItem`, während häufig `packItem/unpackItem` verwendet wird. Einheitliche Begriffe erleichtern das Verständnis.\n- In `KnapsackN` fehlt der Parametername `args` in der `main`-Signatur (auch wenn du ihn nicht nutzt); das ist Standard und macht direkt klar, dass es ein ausführbares Programm ist.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, dadurch wird keine Lösung gesucht/gefunden und das Board wird nie korrekt befüllt.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, dadurch wird die Anzahl Lösungen nie korrekt gezählt.\n- In `Queens` ist `main()` nicht als Einstiegspunkt verwendbar (Signatur fehlt: `static` und Parameter), dadurch startet das Programm so wie erwartet nicht.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise vorgeht: in einer Zeile jede Spalte ausprobieren, bei gültiger Platzierung die Dame setzen, zur nächsten Zeile gehen, und bei Misserfolg wieder zurücksetzen (Backtrack).\n- Für `count()`: Nutze eine ähnliche Rekursion wie bei `solve()`, aber statt beim ersten Fund abzubrechen, zählst du alle vollständigen Platzierungen zusammen; vergiss dabei nicht, nach dem rekursiven Aufruf die gesetzte Dame wieder zu entfernen.\n- Für `main()`: Vergleiche deine `main`-Methode mit der erwarteten Java-Startsignatur, damit die Klasse direkt ausführbar ist.\n\n### Code Style\n- In `getBoard()` ist `return this.board;` zwar okay, aber inkonsistent zum restlichen Code/Beispiel; bleib bei einer Variante (mit oder ohne `this`) für bessere Lesbarkeit.\n- Die `// TODO implement`-Kommentare sind sinnvoll während der Arbeit, sollten aber entfernt/ersetzt werden, sobald du die Methoden implementiert hast.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, die Methoden `solved(model, fieldNr)` und `nofSolutions(model, fieldNr, max)` sind nicht implementiert und liefern immer `false` bzw. `0`, damit wird weder gelöst noch die Anzahl Lösungen gezählt (Aufgabenpunkt 2 und 4 nicht erfüllt).\n- `Sudoku.java`: Die `main`-Methode hat nicht die korrekte Signatur (`public static void main(String[] args)`), dadurch startet die Applikation typischerweise nicht über den Java-Entry-Point.\n\n### Suggestion\n- Für `solved(...)`: Überlege dir eine Rekursion mit Backtracking über ein lineares Feld-Indexing (`fieldNr` von 0 bis `size*size - 1`), mit einem Abbruchfall „alle Felder verarbeitet“. Bei vorgegebenen Feldern (Wert != 0) solltest du direkt zum nächsten Feld weitergehen; bei leeren Feldern probierst du Werte 1..size und prüfst nach dem Setzen mit `checker.oneOK(...)`, ob der Zwischenzustand gültig ist. Wenn kein Wert funktioniert, musst du das Feld wieder leeren, bevor du zurückgehst.\n- Für `nofSolutions(...)`: Das ist fast dieselbe Rekursion, nur dass du statt `true/false` die Anzahl gefundener Lösungen aufsummierst. Denk daran, dass du beim Zählen *nicht* bei der ersten Lösung stoppen darfst, aber trotzdem bei `MAX` abbrechen solltest (Parameter `max` sinnvoll „runterzählen“ oder mit dem bisherigen Count vergleichen).\n- Für `nofSolutions(...)` zusätzlich: Achte darauf, dass der Model-Zustand nach dem Durchprobieren (egal ob Lösungen gefunden wurden oder nicht) wieder zurückgesetzt wird (Backtracking), damit die Methode die Vorgabe „Model reset to its initial state“ einhalten kann.\n\n### Code Style\n- Die `// TODO implement`-Stellen sind noch im Code; sobald du fertig bist, entferne diese Marker, damit klar ist, dass die Implementierung vollständig ist.\n- In `Sudoku.java` fehlt das übliche `public static` bei `main`; auch wenn das inhaltlich „nur“ eine Signatur ist, ist es in Java-Konventionen sehr relevant fürs Ausführen/Tests.\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" : "Connection refused to host: 172.25.0.5; nested exception is: \n\tjava.net.ConnectException: Connection refused"
    }, {
      "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
    } ]
  }
}