AutoFeedback API

Result 8096b450-dbfc-4949-9690-57ff8fc6d5c5

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Triangles.drawRec` zeichnest du im rekursiven Fall (`n > 0`) nur **ein** Unterdreieck rekursiv; gefordert ist aber die rekursive Zerlegung in mehrere (typisch drei) Teil-Dreiecke pro Stufe, sonst entsteht nicht das gewünschte Fraktal-Muster.\n- In `Triangles.drawRec` zeichnest du im rekursiven Fall zusätzlich jedes Mal wieder das große Dreieck mit `g.drawLine(...)`; dadurch wird nicht nur am Ende (Basisfall) gezeichnet, sondern auf jeder Ebene, was die erwartete Ausgabe verfälscht.\n\n### Suggestion\n- Überlege dir, welche Punkte die **Mittelpunkte der drei Seiten** deines Dreiecks sind (jeweils Mittelwert der Endpunkt-Koordinaten) und welche **drei kleineren Dreiecke** daraus entstehen; genau diese drei solltest du dann mit `n-1` rekursiv aufrufen.\n- Zeichne die Linien nur dann, wenn du wirklich „fertige“ Dreiecke zeichnen willst (typisch im Basisfall). Prüfe, ob du das große Dreieck im rekursiven Schritt wirklich nochmal zeichnen musst oder ob die Rekursion das Zeichnen übernehmen soll.\n\n### Code Style\n- In `Triangles.drawRec` ist der Kommentar `// TODO implement` stehen geblieben, obwohl du bereits implementiert hast – den solltest du entfernen/aktualisieren.\n- Variablennamen wie `x00`, `y00`, `x11` etc. sind schwer lesbar; sprechende Namen (z.B. für Seitenmittelpunkte) machen die Geometrie und die Rekursion deutlich nachvollziehbarer.\n\n\n# Exercise: knapsack\n\n### Correctness\n- `pack(int i)` ist nicht implementiert, dadurch wird nie eine Lösung durchsucht und `solve()` liefert immer `0`.\n- `loadItem(int i)` und `unloadItem(int i)` sind nicht implementiert, damit kann der Zustand (`currWeight`, `currValue`) nie korrekt verändert/zurückgesetzt werden.\n- Die Anforderung “Gegenstände bis zu n‑Mal mitnehmen” wird aktuell nirgends umgesetzt (kein Loop/Zählung pro Item).\n- In `KnapsackN` hat `main()` nicht die übliche Signatur `main(String[] args)`; je nach Test-/Runner-Setup wird das Programm so nicht gestartet.\n\n### Suggestion\n- Baue die Rekursion in `pack(i)` so auf, dass du für jedes Item systematisch alle Varianten durchprobierst: 0x nehmen, 1x nehmen, … bis `maxN` (oder bis das Gewicht zu groß wird), und danach jeweils mit `i+1` weitermachst.\n- Denk daran, am Ende (wenn `i` alle Items durchlaufen hat) zu prüfen, ob die aktuelle Kombination gültig ist (`currWeight <= maxWeight`) und ob `currValue` ein neues Maximum ist.\n- Wenn du in einer Schleife mehrfach `loadItem(i)` aufrufst, brauchst du am Schluss einen passenden “Rollback” in `unloadItem(i)`, damit der Zustand für den nächsten Rekursionszweig wieder stimmt.\n- Passe die `main`-Methode an die erwartete Signatur an, falls die Tests/Umgebung die Klasse ausführen sollen.\n\n### Code Style\n- Die TODO-Methoden (`pack/loadItem/unloadItem`) sind noch leer; wenn du sie nicht verwenden willst, entferne sie, ansonsten benenne sie konsistent (z.B. `packItem/unpackItem`) und nutze sie auch wirklich.\n- `KnapsackN.main()` ohne Parameter ist unüblich; die Standard-Signatur verbessert Lesbarkeit und Tool-Kompatibilität.\n\n\n# Exercise: queens\n\n### Correctness\n- `QueensSolver.solve()` ist nicht implementiert und liefert immer `false`, damit wird keine Lösung gesucht/gefunden.\n- `QueensSolver.count()` ist nicht implementiert und liefert immer `0`, damit wird die Anzahl möglicher Lösungen nicht gezählt.\n\n### Suggestion\n- Für `solve()`: Überlege dir eine rekursive Backtracking-Funktion, die zeilenweise vorgeht (z.B. Parameter `row`). In jeder Zeile probierst du alle Spalten aus, prüfst mit `checkPlacement(...)`, setzt die Dame, gehst zur nächsten Zeile und machst bei Misserfolg das Setzen wieder rückgängig.\n- Für `count()`: Nutze eine sehr ähnliche Rekursion wie bei `solve()`, aber statt beim ersten Fund abzubrechen, sammelst du die Anzahl aller vollständigen Platzierungen. Wichtig ist auch hier das Zurücksetzen des Feldes nach dem rekursiven Aufruf.\n\n### Code Style\n- In `Queens.java` ist `main()` nicht `static` und hat keine `String[] args`-Parameter; das ist unüblich für einen Java-Programmeinstieg und kann dazu führen, dass das Programm nicht wie erwartet startbar ist.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `SudokuSolverImpl`, both required methods are not implemented: `solved(model, fieldNr)` always returns `false`, and `nofSolutions(model, fieldNr, max)` always returns `0`, so the solver can never solve or count solutions.\n- `solved(SudokuModel model)` must reset the model to its initial state when no solution is found; with the current stub it just returns `false` without ensuring the model is restored.\n- `nofSolutions(SudokuModel model)` must reset the model to its initial state after counting; the current stub does not perform any backtracking/cleanup.\n- In `Sudoku.java`, the entry point is not a valid Java main method (`void main()` instead of `public static void main(String[] args)`), so the application won’t start as expected.\n\n### Suggestion\n- For `solved(...)`: think in terms of a recursive backtracking over a single linear index (`fieldNr`) from `0` to `size*size - 1`; use it to compute `(i, j)` and decide whether to skip preset fields or try values.\n- When trying values in an empty cell, after setting a candidate number, use the checker to validate the *partial* placement (hint: there’s a method intended for checking a single position).\n- Make sure you have a clear stopping condition for “all fields processed” and return success from there.\n- For the “no solution found” path, ensure you undo any tentative assignments you made before returning (otherwise the model won’t be restored).\n- For `nofSolutions(...)`: it’s essentially the same recursion as `solved`, except instead of stopping at the first success you accumulate counts; also consider how to stop early once you reach the provided `max`.\n- For `Sudoku.java`: adjust the method signature so Java can actually launch the program via the standard main entry point.\n\n### Code Style\n- The `// TODO implement` stubs with unconditional `return false;` / `return 0;` are fine during development, but once you start implementing, remove the placeholder returns to avoid accidentally short-circuiting your logic.\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" : "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
    } ]
  }
}