AutoFeedback API

Result 6c2bc051-e4ad-4244-8a00-ebeaa36e4fee

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- **Boxes:** Du zeichnest im Rekursionsfall das grosse Rechteck (`g.drawRect(x, y, s, s)`), aber bei `n == 0` zeichnest du gar nichts. Dadurch ist der Basisfall nicht erfüllt und für `n=0` bleibt das Bild leer (und auch allgemein ist das Muster nicht das verlangte „nur kleinste Kästchen zeichnen“).\n- **Boxes:** Es fehlt der vierte Quadrant (unten links). Du rufst nur 3 rekursive Teilquadrate auf, aber die Vorlage/Anforderung zielt auf 4 Teilbereiche.\n- **Triangles:** Dein Basisfall ist verkehrt herum: Du zeichnest nur, wenn `n > 0`, bei `n == 0` wird nichts gezeichnet. Damit ist die Rekursion bei der kleinsten Stufe unsichtbar.\n- **Triangles:** Du zeichnest bei *jedem* Rekursionslevel das umschliessende Dreieck erneut. Üblich/erwartet ist, dass im Basisfall gezeichnet wird und sonst nur weiter unterteilt wird (sonst bekommst du zusätzliche Linien, die nicht zum Fraktal-Muster passen).\n- **Triangles:** Die Koordinatenberechnungen für die drei Teil-Dreiecke wirken inkonsistent (z.B. verwendest du bei einem Punkt `y0 + (y1 - y0)/2` an Stellen, wo eher die Mitte zwischen anderen Eckpunkten gebraucht würde). Dadurch entstehen sehr wahrscheinlich „falsche“ Teil-Dreiecke (schief / an falscher Position).\n\n### Suggestion\n- **Boxes:** Überlege dir einen klaren Basisfall: Was soll passieren, wenn `n == 0`? Genau dann solltest du das Quadrat tatsächlich zeichnen. Für `n > 0` teilst du nur auf und rufst rekursiv auf.\n- **Boxes:** Skizziere ein Quadrat und markiere die 4 Unterquadrate (oben links, oben rechts, unten links, unten rechts). Prüfe dann, ob du für alle 4 Bereiche entweder rekursiv weitergehst oder (falls einer „voll“ bleiben soll) ihn direkt im Basisfall zeichnest.\n- **Triangles:** Dreh die Logik um: Im Basisfall (`n == 0`) zeichnest du die 3 Linien des Dreiecks; ansonsten berechnest du die Mittelpunkte der Kanten und rufst Rekursion auf den 3 entstehenden Eck-Dreiecken auf.\n- **Triangles:** Statt „komplizierte“ Ausdrücke wie `x1 + (x0 - x1)/2` überall zu verteilen: Berechne zuerst sauber die drei Mittelpunkte (zwischen (x0,y0)-(x1,y1), (x0,y0)-(x2,y2), (x1,y1)-(x2,y2)) und verwende diese dann zum Zusammensetzen der 3 Sub-Dreiecke. Das reduziert Rechenfehler massiv.\n\n### Code Style\n- - In `Triangles.drawRec` ist der Kommentar `// use g.drawLine(...)...` am Ende etwas irreführend platziert, weil du dort schon zeichnest; entweder entfernen oder dort platzieren, wo der Basisfall tatsächlich implementiert ist.\n- - In beiden Klassen würde Lesbarkeit profitieren, wenn du „magische“ Ausdrücke für Mittelpunkte/`s/2` erst in lokale Variablen legst (z.B. `half = s/2`, `mx01`, `my01`, …).\n\n\n# Exercise: knapsack\n\n### Correctness\n- In deiner `pack`-Methode nutzt du im `while (n <= 3)` eine feste Grenze `3` statt den tatsächlich übergebenen Wert `maxN`. Damit funktioniert die Lösung nicht korrekt für andere `maxN`-Werte als 3.\n- Du übergibst `maxN` als Parameter an `pack(int i, int n, int maxN)`, verwendest diesen Parameter aber (abgesehen vom Weiterreichen) nie zur Begrenzung der Anzahl Kopien.\n- Deine Rekursion läuft nur dann weiter, wenn `currWeight <= maxWeight` gilt. Sobald das Gewicht überschritten ist, brichst du ab, ohne in diesem Zweig den Zustand wieder „sauber“ zu verlassen. Das kann dazu führen, dass Kombinationen nicht vollständig korrekt geprüft werden (insbesondere wenn du in einem Schritt über das Limit gehst und danach eigentlich wieder entladen müsstest, bevor du andere Möglichkeiten probierst).\n\n### Suggestion\n- Ersetze die fest codierte `3` in der Schleife durch etwas, das sich aus der Aufgabenstellung ergibt (also aus `maxN`). Überlege: Wofür hast du `maxN` überhaupt als Feld/Parameter?\n- Prüfe, ob du `maxN` wirklich als Parameter an `pack` brauchst oder ob du direkt das Feld `this.maxN` verwenden willst – wichtig ist, dass die Schleifen/Verzweigungen davon abhängig sind.\n- Überlege dir eine klare Invariante beim Backtracking: Egal wie ein Zweig endet (auch wenn `currWeight > maxWeight`), solltest du am Ende eines „Item-Blocks“ wieder im exakt gleichen Zustand sein wie beim Eintritt in diesen Block. Schau dir an, ob dein Entladen zuverlässig immer passiert, auch wenn ein Zweig wegen Übergewicht nicht weitergeht.\n\n### Code Style\n- Die Signatur `pack(int i, int n, int maxN)` ist verwirrend, weil `maxN` bereits ein Feld ist und `n` als Zustand „mitgeschleppt“ wird, obwohl du ihn innerhalb der Methode auch einfach lokal handhaben könntest. Das macht den Code unnötig schwer lesbar.\n- `while (n <= 3)` ist ein „Magic Number“-Problem (selbst wenn es zufällig dem Testfall entspricht). Nutze dafür eine benannte Konstante oder direkt `maxN`.\n- In `unloadItem`/`loadItem` könntest du kürzere Schreibweisen verwenden (`+=`, `-=`), das erhöht die Lesbarkeit.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `nofSolutions(...)` kann es passieren, dass du bei Erreichen von `max` direkt `return max;` machst, ohne das aktuell bearbeitete Feld wieder zu `clear()`en. Damit ist das Modell danach nicht garantiert im Initialzustand, wie es die Aufgabenbeschreibung für `nofSolutions` verlangt.\n- In `Sudoku.java` ist die `main`-Methode nicht als `public static void main(String[] args)` deklariert. Damit startet die Applikation in einer normalen Java-Umgebung nicht wie vorgesehen.\n\n### Suggestion\n- Achte in `nofSolutions(...)` darauf, dass **jeder** Rückgabepfad (auch frühe Abbrüche wegen `max`) vorher das Feld, das du gerade testweise gesetzt hast, wieder zurücksetzt. Überleg dir: Wo genau solltest du vor einem `return` noch “aufräumen”?\n- Prüfe die Methodensignatur von `main`: Java sucht beim Start exakt nach der Standard-Signatur. Vergleiche deine Signatur mit dem, was die JVM erwartet.\n\n### Code Style\n- Du verwendest in `solved`/`nofSolutions` harte Konstanten (`80`, `9`). Lesbarer und robuster wird es, wenn du stattdessen konsequent `model.size()` (und daraus `size*size`) verwendest.\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" : "PASSED",
      "message" : null
    }, {
      "name" : "uselessStuff()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "random1()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "random2()",
      "status" : "FAILED",
      "message" : "expected: <340> but was: <334>"
    }, {
      "name" : "random3()",
      "status" : "FAILED",
      "message" : "expected: <558> but was: <541>"
    }, {
      "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
    } ]
  }
}