AutoFeedback API

Result 7ad29573-b29a-4308-b129-f7debfd057e7

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` ist die Abbruchbedingung falsch: Bei `n == 1` wird sofort zurückgegeben, dadurch wird für diese Stufe gar nichts gezeichnet (und `n == 0` wird nie als Basisfall behandelt).\n- In `Boxes.drawRec` rufst du rekursiv einmal wieder mit **demselben** `x, y, s` auf (`drawRec(g, x, y, s, n-1)`), also ohne Verkleinerung/Positionsänderung; das passt nicht zur geforderten rekursiven Unterteilung und führt dazu, dass du immer wieder das identische Quadrat weiter aufrufst.\n- In `Triangles.drawRec` ist die Abbruchbedingung ebenfalls falsch: Bei `n == 1` wird zurückgegeben, ohne ein Dreieck zu zeichnen; ein Basisfall sollte das Zeichnen des kleinsten Dreiecks enthalten.\n- In `Triangles.drawRec` zeichnest du die Dreieckslinien auch in den Rekursionsstufen (`else`), nicht nur im Basisfall; dadurch werden „große“ Dreiecke in jeder Tiefe erneut gezeichnet und das Ergebnis entspricht nicht der gewünschten rekursiven Form.\n\n### Suggestion\n- Überlege dir für beide Formen einen Basisfall, bei dem tatsächlich gezeichnet wird (typisch: „wenn keine weitere Unterteilung mehr nötig ist“), und stelle sicher, dass genau dieser Fall die Primitive (`drawRect`/`drawLine`) ausführt.\n- Prüfe bei den rekursiven Aufrufen in `Boxes`, ob **alle** Aufrufe mit halbierter Seitenlänge (`s/2`) und passenden Offsets arbeiten; ein Aufruf ohne Änderung von `x,y,s` ist ein Warnsignal.\n- Bei den Dreiecken: Berechne die drei Mittelpunkte der Kanten und rufe dann rekursiv nur auf die drei entstehenden Teildreiecke auf; zeichne die Linien idealerweise nur im Basisfall, nicht bei jedem rekursiven Schritt.\n\n### Code Style\n- Entferne auskommentierten Code und „TODO implement“-Reste, sobald du dich für eine Variante entschieden hast (z.B. die auskommentierten `g.drawRect(...)`-Zeilen und die alten Kommentar-Rechnungen in `Triangles`).\n- Die Inline-Kommentare mit Beispielrechnungen (z.B. `//400+10/2= 205`) sind eher verwirrend, weil sie teils ohne Klammern gerechnet wirken; besser kurz beschreiben *was* berechnet wird (Mittelpunkt einer Kante) statt konkrete Zahlen hinzuschreiben.\n- In `Fractal` hast du `n` initial auf `10` gesetzt statt wie in der Vorlage; ist nicht falsch, aber für Tests/Bedienung oft angenehmer, mit einem kleineren Standardwert zu starten.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(int i)` verwendest du `for(; i <= maxN; i++)` und überschreibst damit den Parameter `i` (Index des Items); dadurch wird `i` sowohl als Item-Index wie auch als Anzahl-Wiederholungen benutzt, was die Rekursion falsch macht.\n- Durch `i <= maxN` kann `i` Werte annehmen, die nichts mit `weights.length` zu tun haben; dadurch riskierst du Zugriffe wie `weights[i]`/`values[i]` mit einem Index außerhalb des Arrays.\n- Du prüfst die Gewichtsgrenze (`currWeight <= maxWeight`) nicht vor dem weiteren Rekursionsabstieg/Beladen; dadurch werden Zustände weiterverfolgt, die schon über `maxWeight` liegen und die Suche läuft nicht wie gefordert.\n- `unloadItem(i)` macht nur ein einzelnes Item rückgängig, aber deine Schleifen-/Rekursionslogik lädt potenziell ein Item mehrfach; der Zustand (Weight/Value) wird dadurch nicht korrekt zurückgesetzt.\n- Die aktuelle Logik berücksichtigt nicht korrekt “ein Item bis zu maxN-mal” (0..maxN Stück) pro Itemtyp, weil die Wiederholungsanzahl nicht sauber pro Itemtyp durchiteriert wird, sondern über den Index `i` vermischt wird.\n\n### Suggestion\n- Trenne gedanklich die zwei “Zählvariablen”: eine für den Item-Index (0..weights.length-1) und eine für die Anzahl Exemplare dieses Items (0..maxN). Der Item-Index sollte in der Rekursion von `i` nach `i+1` gehen und nicht in einer Schleife bis `maxN` laufen.\n- Baue an der Stelle, wo du verzweigst, explizit den Fall “0 Stück von Item i” und dann “1 Stück … bis maxN Stück” für dasselbe Item ein, bevor du zur nächsten Item-Sorte (`i+1`) gehst.\n- Prüfe `currWeight <= maxWeight` möglichst früh (bevor du tiefer gehst), damit übergewichtige Teilzustände nicht weiter expandiert werden.\n- Achte darauf, dass das “Rückgängig machen” (unload) genau die Menge zurücknimmt, die du in der Schleife zuvor eingeladen hast (z.B. wenn du in einer Schleife 3-mal eingeladen hast, musst du am Ende auch 3-mal bzw. entsprechend vielfach zurücksetzen).\n\n3. Code Style:\n- Entferne `System.out.println(...)` Debug-Ausgaben aus `pack`, `loadItem`, `unloadItem`, da sie Tests/Output stören können und Logik unübersichtlich machen.\n- Vermeide es, den Parameter `i` als Schleifenvariable wiederzuverwenden; nutze separate lokale Variablen mit sprechenden Namen, um Verwechslungen zu verhindern.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `Sudoku.java` ist `main()` nicht `public static void main(String[] args)`, dadurch startet die Applikation/GUI typischerweise nicht.\n- `nofSolutions` erfüllt die Anforderung nicht: Du setzt `max` direkt am Anfang auf `0`, dadurch kann die Methode nie sinnvoll bis `MAX` zählen/abbrechen.\n- `nofSolutions` ruft an mehreren Stellen `solved(...)` auf statt rekursiv `nofSolutions(...)` weiterzuzählen; so zählst du Lösungen nicht korrekt, sondern versuchst (teilweise) nur zu lösen.\n- `nofSolutions`: Im Fall `model.get(row,col) != 0` ignorierst du den Rückgabewert und gibst am Ende trotzdem `max` zurück; damit kommt in diesem Pfad keine korrekte Anzahl zustande.\n- `nofSolutions`: Der Block `if(fieldNr == 81)` innerhalb der Schleife ist logisch unerreichbar, weil du in diesem Kontext bereits im `else`-Zweig bist (also `fieldNr != 81`).\n- `nofSolutions`: Die Methode garantiert nicht, dass das `model` am Ende wieder auf den Ausgangszustand zurückgesetzt ist (Anforderung: “model was reset to its initial state.”). Durch die `solved(...)`-Aufrufe kann das Modell gelöst “stehen bleiben”.\n\n### Suggestion\n- Schau dir die Java-Signatur an, die die JVM als Einstiegspunkt erwartet, und passe deine `main`-Methode entsprechend an.\n- Behandle `max` als “Remaining budget” (wie viele Lösungen du noch zählen darfst), statt es am Anfang zu überschreiben; überlege dir, wie du beim Rekursionsabstieg dieses Budget verringerst.\n- Für das Zählen: Statt beim nächsten Feld `solved(...)` aufzurufen, brauchst du eine Rekursion, die eine Anzahl zurückgibt und diese aufsummiert; denke in “Ankerfall = 1 Lösung gefunden” und sonst “Summe über alle gültigen Kandidaten”.\n- Im Fall “Feld ist vorgegeben” solltest du einfach zum nächsten Feld weitergehen und das Ergebnis dieser Rekursion zurückgeben (nicht ignorieren).\n- Prüfe, ob du wirklich zwei `if (fieldNr == 81)` brauchst: einmal als Ankerfall ganz oben reicht normalerweise; alles andere wird durch die Rekursion abgedeckt.\n- Damit das Modell nach `nofSolutions` wieder wie am Anfang ist: Überlege dir eine klare Backtracking-Regel (“nachdem ich alle Werte probiert habe, räume ich das Feld wieder auf”) und wende sie konsequent nur für Felder an, die du selbst gesetzt hast.\n\n3. Code Style:\n- Entferne die vielen `System.out.println(...)` Debug-Ausgaben (die GUI/Threads werden sonst extrem langsam und die Konsole wird zugespammt).\n- Verwende `model.size()` statt hart codiert `9`/`81`, dann ist der Code konsistenter mit dem Interface (auch wenn hier fix 9x9 verwendet wird).\n- In `nofSolutions` ist der Parametername `max` missverständlich, wenn du ihn als Zähler verwendest; trenne gedanklich “Zähler” und “Limit”, dann wird die Logik auch lesbarer.\n\n\n# Exercise: queens\n\nLlm Evaluation ist für diese Aufgabe deaktiviert. Entferne die .llmignore Datei vom Package der Aufgabe.\n",
    "status" : "SUCCESS"
  },
  "unitTest" : {
    "tests" : [ {
      "name" : "allZero()",
      "status" : "FAILED",
      "message" : "Connection refused to host: 172.25.0.3; nested exception is: \n\tjava.net.ConnectException: Connection refused"
    }, {
      "name" : "uselessStuff()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "random1()",
      "status" : "FAILED",
      "message" : "expected: <190> but was: <174>"
    }, {
      "name" : "random2()",
      "status" : "FAILED",
      "message" : "expected: <340> but was: <0>"
    }, {
      "name" : "random3()",
      "status" : "FAILED",
      "message" : null
    }, {
      "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
    } ]
  }
}