AutoFeedback API

Result ff808df4-04ba-4b99-89c6-3ae0daa48619

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Triangles.drawRec`, im Rekursionsfall (`n > 0`) zeichnest du zusätzlich zum rekursiven Zeichnen nochmals die drei Kanten des aktuellen (grossen) Dreiecks. Dadurch entstehen Linien, die bei der rekursiven Variante normalerweise nicht jedes Mal erneut über alle Ebenen drübergezeichnet werden (das verändert das gewünschte Fraktalbild).\n- In `Triangles.drawRec` verwendest du bei einem der rekursiven Aufrufe für den y-Wert des Mittelpunkts unten `y1` statt den Mittelwert von `y1` und `y2`. Das ist nur zufällig korrekt, weil in deinem Startdreieck `y1 == y2` gilt; allgemein stimmt die Berechnung so nicht.\n- In `Triangles.drawRec` berechnest du Mittelpunkte mehrfach inline und nicht konsistent (teilweise `(...)/2`, teilweise fest `y1`). Das kann zu falschen Teil-Dreiecken führen, wenn die Eingabe-Koordinaten nicht exakt dein Startdreieck sind.\n\n### Suggestion\n- Überlege dir, was das Basis-Dreieck (`n == 0`) zeichnet und was die Rekursion leisten soll: Im Rekursionsfall sollte typischerweise *nur* in kleinere Dreiecke aufgeteilt werden (und nicht zusätzlich das grosse Dreieck nochmal zeichnen). Prüfe, ob die extra `drawLine(...)` im `else` wirklich nötig sind.\n- Berechne die drei Mittelpunkte der Dreiecksseiten einmal sauber (jeweils Mittelwert der zugehörigen Endpunkte) und verwende genau diese Punkte dann für die drei rekursiven Aufrufe. Damit vermeidest du, dass du irgendwo „aus Versehen“ `y1` einsetzt, wo eigentlich ein Mittelwert hingehört.\n- Teste dein `drawRec` gedanklich mit einem „schiefen“ Dreieck (z.B. `y1 != y2`). Wenn dann ein Teil-Dreieck nicht mehr in der richtigen Ecke landet, weist das direkt auf eine falsche Mittelpunktberechnung hin.\n\n### Code Style\n- In `Triangles.drawRec` sind die Mittelpunkt-Berechnungen mehrfach als lange Ausdrücke in den Argumenten versteckt. Das macht es schwer zu prüfen und leicht fehleranfällig; speichere die Mittelpunkte in gut benannten lokalen Variablen (wie `mid01X`, `mid01Y`, …).\n- Entferne das `// TODO implement` in `Triangles.drawRec`, wenn du die Methode bereits implementiert hast, damit der Codezustand klar bleibt.\n- In `Boxes.drawRec` sind die Kommentare (rechts oben, etc.) ok, aber eine einheitliche Reihenfolge (z.B. immer oben-links, oben-rechts, unten-rechts, unten-links) würde das Lesen/Debuggen erleichtern.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `KnapsackImpl` sind `pack(int i)`, `loadItem(int i)` und `unloadItem(int i)` nicht implementiert; damit kann `solve()` keine optimale Lösung berechnen und die Tests werden fehlschlagen.\n- `KnapsackN.main()` hat keine Signatur `main(String[] args)`; so lässt sich das Programm typischerweise nicht direkt als Java-Startklasse ausführen (auch wenn die Tests evtl. nur `KnapsackImpl` prüfen).\n\n### Suggestion\n- Überlege dir für `pack(i)` die Rekursions-/Backtracking-Logik: Welche Abbruchbedingung brauchst du, wenn `i` am Ende der Item-Liste ist, und wann aktualisierst du `maxValue`?\n- Denke daran, dass du pro Gegenstand nicht nur „0 oder 1“, sondern „0 bis maxN“ Exemplare ausprobieren musst; das lässt sich z.B. über eine Schleife innerhalb von `pack(i)` abbilden, bevor du zu `pack(i+1)` weitergehst.\n- Achte darauf, dass dein Zustands-Backtracking korrekt ist: Wenn du ein Item mehrfach „lädst“, musst du am Ende beim Zurückgehen exakt die gleiche Menge wieder „entladen“, sonst beeinflusst ein Zweig den nächsten.\n- Für die Startbarkeit: Passe die `main`-Methode so an, dass sie von der JVM als Einstiegspunkt erkannt wird.\n\n### Code Style\n- Die Methoden heißen `loadItem/unloadItem`, im Lernmaterial/Beispiel wird oft `packItem/unpackItem` verwendet; einheitliche Benennung (Verb + Bedeutung) macht die Rekursion leichter nachvollziehbar.\n- In `KnapsackN` fehlt `String[] args` in `main`; auch wenn es funktional für Tests egal sein kann, ist das ein gängiger Java-Standard und vermeidet Verwirrung beim Ausführen in der IDE.\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/auf das Board gesetzt.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl Lösungen nicht gezählt.\n- In `Queens` ist `main()` nicht als `static void main(String[] args)` deklariert; so startet das Programm in Java normalerweise nicht (Eintrittspunkt fehlt).\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise arbeitet: Basisfall “alle Zeilen behandelt”, sonst in der aktuellen Zeile alle Spalten testen, eine Dame setzen, rekursiv weiter, und bei Misserfolg wieder entfernen (Backtracking).\n- Für `count()`: Nutze dieselbe Rekursionsstruktur wie bei `solve()`, aber statt beim ersten Fund abzubrechen summierst du alle vollständigen Platzierungen; wichtig ist auch hier, nach dem Rekursionsaufruf die gesetzte Dame wieder zu entfernen.\n- Für `main()`: Vergleiche die Signatur deiner `main`-Methode mit der üblichen Java-Startmethode und passe sie so an, dass die JVM sie als Einstiegspunkt erkennt.\n\n### Code Style\n- In `QueensSolver` stehen noch `// TODO implement`-Platzhalter; sobald du implementierst, diese Kommentare entfernen oder durch sinnvolle Methodennamen/Privatmethoden ersetzen.\n- `getBoard()` gibt `this.board` zurück; `this` ist hier redundant (kein Fehler, aber unnötig).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, both recursive helper methods (`solved(model, fieldNr)` and `nofSolutions(model, fieldNr, max)`) are still unimplemented and therefore will never solve a Sudoku / never count solutions (currently always `false` / `0`).\n- In `Sudoku.java`, the entry point is not a valid Java main method (`void main()` instead of the required `public static void main(String[] args)`), so the application won’t start as intended.\n\n### Suggestion\n- For `solved(...)`: Think about a backtracking recursion over all fields (e.g., by linearizing `(i,j)` into a single `fieldNr`). You need a base case when you passed the last field, logic to skip pre-filled cells, and a loop that tries values `1..size()` in empty cells while using `checker.oneOK(...)` to decide whether to recurse deeper. Don’t forget to undo (clear) a tried value when it doesn’t lead to a solution.\n- For `nofSolutions(...)`: It’s very similar to `solved(...)`, but instead of returning as soon as one solution is found, you accumulate the number of complete solutions. Also use the `max` parameter to stop exploring once enough solutions are found (e.g., stop looping if your count already reached the bound).\n- For `Sudoku.java`: Make the method signature match the JVM entry point exactly (access modifier, `static`, parameter list). Compare with how Java expects the main method to be declared.\n\n### Code Style\n- Remove the `// TODO implement` stubs once you implement the methods, or replace them with meaningful comments about the recursion/base case (otherwise it looks like unfinished template code).\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>"
    }, {
      "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" : "FAILED",
      "message" : "Connection refused to host: 172.25.0.5; nested exception is: \n\tjava.net.ConnectException: Connection refused"
    }, {
      "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" : "FAILED",
      "message" : "Connection refused to host: 172.25.0.6; nested exception is: \n\tjava.net.ConnectException: Connection refused"
    }, {
      "name" : "solveReturnsFalseForN3()",
      "status" : "PASSED",
      "message" : null
    } ]
  }
}