AutoFeedback API

Result d7ccd467-1d23-4223-a2c4-aa6b5a875979

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du bei jedem Rekursionsschritt sofort ein Rechteck (auch wenn `n > 0`) und hast keinen klaren Basisfall bei `n == 0`; dadurch entsteht nicht die geforderte rekursive Box-Struktur (sondern “alle Ebenen” werden jeweils komplett gezeichnet).\n- In `Boxes.drawRec` fehlt der rekursive Aufruf für das unten-links Teilquadrat; dadurch ist das Muster unvollständig.\n- In `Triangles.drawRec` zeichnest du das Dreieck in jedem Rekursionsschritt (auch wenn `n > 0`) statt nur im Basisfall; dadurch werden zu viele Linien gezeichnet und das Fraktal entspricht nicht der erwarteten rekursiven Dreiecks-Aufteilung.\n\n### Suggestion\n- Überlege dir für beide Formen einen eindeutigen Abbruchfall: Welche minimale Zeichnung soll bei `n == 0` passieren, und was soll stattdessen passieren, wenn `n > 0`?\n- Bei den Boxes: Wenn du die Fläche in 4 Quadranten teilst, prüfe, ob du wirklich alle 4 Positionen berücksichtigst (oben-links, oben-rechts, unten-rechts, unten-links) – und ob ggf. einer davon “anders” behandelt werden soll.\n- Bei den Triangles: Zeichne die Kanten nur dann, wenn du nicht weiter unterteilst; für `n > 0` berechnest du Mittelpunkte und rufst die Rekursion für die 3 Teildreiecke auf, ohne zusätzlich das große Dreieck nochmal zu zeichnen.\n\n### Code Style\n- `if (n < 0) return;` ist als Rekursions-Guard ok, aber lesbarer/üblicher ist ein expliziter Basisfall (`n == 0`) und ein klarer `else`-Zweig für die Rekursion.\n- In `Boxes.drawRec` überschreibst du den Parameter `s` (`s = s / 2;`); das ist zwar legal, aber mit einer neuen Variable (z.B. `half`) wird es deutlich verständlicher.\n- Auskommentierter Code in `Triangles` (`//drawRec(...)`) sollte entfernt werden, wenn er nicht mehr gebraucht wird.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(int i)` lädst du ein Item bis zu `maxN`-mal, aber durch `unloadItem(i)` entlädst du es pro Schleifendurchlauf nur **einmal**. Dadurch bleibt nach dem Loop u.U. ein Teil der geladenen Gegenstände im Zustand (`currWeight/currValue`) „hängen“, was die weiteren Rekursionszweige verfälscht.\n- Die Schleifenstruktur in `pack(int i)` zählt die „ohne Item“-Variante mehrfach: `pack(i+1)` wird in jedem `j`-Durchlauf erneut aufgerufen, obwohl sich der Zustand dabei nicht ändert. Das führt zu doppelten/mehrfachen gleichen Teilbäumen (und kann auch das Ergebnis verfälschen, wenn der Zustand wegen des ersten Problems nicht sauber zurückgesetzt wird).\n- `KnapsackN.main()` hat nicht die übliche Signatur `main(String[] args)`. Falls die Tests/Runner eine echte Java-`main` erwarten, wird das Programm so nicht als Einstiegspunkt erkannt.\n\n### Suggestion\n- Achte darauf, dass nach dem Durchprobieren aller `n`-Varianten für ein Item der Zustand exakt wieder so ist wie beim Eintritt in `pack(i)` (Backtracking-Invariante). Überlege: Wenn du ein Item in einem Zweig mehrmals lädst, wie viele „Schritte“ musst du am Ende wieder rückgängig machen?\n- Trenne gedanklich die Fälle „0-mal nehmen“ und „1..maxN-mal nehmen“ klar, sodass jeder Fall genau einmal exploriert wird. Prüfe, ob dein `pack(i+1)` wirklich an der richtigen Stelle steht, oder ob du damit denselben Fall unnötig oft besuchst.\n- Wenn dein Code auch über `KnapsackN` gestartet werden soll, passe die `main`-Signatur an das an, was Java als Programmeinstieg verlangt.\n\n### Code Style\n- In `pack(int i)` sind noch mehrere `// TODO implement`/`TODO:`-Kommentare, obwohl du bereits Logik implementiert hast; entweder entfernen oder aktualisieren, damit der Code nicht widersprüchlich wirkt.\n- Kommentare sind teils unvollständig/fragmentiert („Welche Bedingungen müssen gelten, das“). Formuliere sie zu vollständigen Sätzen oder entferne sie, wenn sie keinen Zusatznutzen bieten.\n\n\n# Exercise: sudoku\n\n### Correctness\n- `nofSolutions` / `nofSolutions(model, fieldNr, max)` ist noch nicht implementiert und liefert immer `0`, damit wird die Anforderung “Anzahl Lösungen zählen (bis MAX)” nicht erfüllt.\n- In `Sudoku.java` ist die `main`-Methode nicht als Java-Entry-Point definiert (`public static void main(String[] args)`), dadurch startet die Applikation so nicht wie erwartet.\n\n### Suggestion\n- Für `nofSolutions`: Überlege dir, wie sich dein Backtracking aus `solved` ändern muss, wenn du nicht beim ersten Treffer abbrichst, sondern bei einem vollständig gefüllten Feldsatz “1 Lösung” zurückgibst und alle gültigen Äste aufsummierst. Denk auch daran, dass du das Feld nach dem Durchprobieren wieder leeren musst.\n- Für die MAX-Begrenzung: Nutze den `max`-Parameter wirklich als “Restbudget” und brich die Suche ab, sobald du genug Lösungen gefunden hast (z.B. Schleifenbedingung und rekursiver Aufruf mit reduziertem Budget).\n- Für `main`: Prüfe, welche Signatur die JVM beim Starten eines Java-Programms erwartet, und passe die Methode entsprechend an.\n\n### Code Style\n- In `solved(...)` sind viele kommentierte Selbstfragen/Notizen im Code; hilfreich beim Denken, aber für die Abgabe besser in kurze, klare Kommentare umformulieren oder entfernen.\n- Du hast an mehreren Stellen feste Konstanten (`81`, `9`) direkt verwendet; lesbarer und weniger fehleranfällig wird es, wenn du konsequent `model.size()` (und daraus `size*size`) nutzt, dann funktioniert es auch für andere Sudoku-Grössen.\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.7; 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: <279>"
    }, {
      "name" : "random3()",
      "status" : "FAILED",
      "message" : "expected: <558> but was: <357>"
    }, {
      "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" : "Connection refused to host: 172.25.0.8; nested exception is: \n\tjava.net.ConnectException: Connection refused"
    }, {
      "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" : "Connection refused to host: 172.25.0.9; nested exception is: \n\tjava.net.ConnectException: Connection refused"
    }, {
      "name" : "solveReturnsTrueForN4()",
      "status" : "FAILED",
      "message" : "Connection refused to host: 172.25.0.10; nested exception is: \n\tjava.net.ConnectException: Connection refused"
    }, {
      "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" : "FAILED",
      "message" : "Connection refused to host: 172.25.0.11; nested exception is: \n\tjava.net.ConnectException: Connection refused"
    } ]
  }
}