AutoFeedback API

Result cbd0915f-12f9-4e6d-82b3-18b11575983d

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du bei jedem Rekursionsschritt ein Rechteck und brichst erst bei `n < 0` ab; damit werden auch für `n > 0` die “Zwischenstufen”-Rechtecke gezeichnet und die Rekursionstiefe ist um 1 verschoben (Basisfall ist nicht bei `n == 0`).\n- In `Boxes.drawRec` fehlt der rekursive Aufruf für das unten-links-Quadrat; dadurch entsteht nicht das geforderte 2x2-Muster pro Ebene.\n- In `Triangles.drawRec` zeichnest du das Dreieck in jedem Rekursionsschritt (statt nur im Basisfall), dadurch werden auch hier alle übergeordneten Dreiecke zusätzlich gezeichnet.\n- In `Triangles.drawRec` ist der Abbruch ebenfalls über `n < 0` statt über einen Basisfall wie `n == 0`, wodurch die Tiefe/Iteration nicht so mit `n` übereinstimmt, wie in der Aufgabenlogik vorgesehen.\n\n### Suggestion\n- Überlege dir pro Form einen klaren Basisfall: “Wann wird wirklich gezeichnet?” und “Wann wird nur weiter unterteilt?”. Typischerweise: bei `n == 0` zeichnen, sonst nur rekursiv weitergehen.\n- Prüfe bei den Boxes, welche vier Teilquadrate bei `s/2` entstehen (oben-links, oben-rechts, unten-rechts, unten-links) und ob du wirklich alle vier abdeckst.\n- Wenn du das Zeichnen in Triangles nur im Basisfall machst, sollte die Rekursion nur die drei Teil-Dreiecke mit den Mittelpunkten der Kanten weiterverfolgen; kontrolliere danach, ob bei größerem `n` nicht mehr das große äußere Dreieck immer wieder neu gezeichnet wird.\n- Teste mit kleinen Werten (`n=0`, `n=1`, `n=2`) und vergleiche, ob “ein Schritt mehr” genau eine zusätzliche Unterteilungsebene erzeugt (und nicht “noch ein zusätzliches großes Outline”).\n\n### Code Style\n- Entferne die auskommentierte `drawRec(...)`-Zeile in `Triangles`, wenn du sie nicht mehr brauchst; das macht den Code leichter lesbar.\n- Statt `if (n < 0) return;` wirkt ein expliziter Basisfall (`n == 0`) oft verständlicher, weil er direkt zur Aufgabenidee “Tiefe n” passt.\n\n\n# Exercise: knapsack\n\n### Correctness\n- Du nutzt `maxN` nirgends, damit löst dein Algorithmus weiterhin nur das 0/1-Knapsack (jeden Gegenstand höchstens einmal), nicht „jeden Gegenstand bis zu n‑mal“ wie gefordert.\n- In `pack(i)` wird ein Item nur einmal geladen (`loadItem(i)` genau einmal) und danach wieder entladen; damit sind Konfigurationen mit 2x, 3x, … desselben Items nicht erreichbar.\n\n### Suggestion\n- Überlege dir in `pack(i)`, wie du für ein festes Item `i` nicht nur die Fälle „0-mal“ und „1-mal“ abbildest, sondern auch „2-mal … bis maxN-mal“; dafür brauchst du typischerweise eine Schleife oder wiederholte Rekursion pro Item.\n- Achte darauf, dass dein „Zurücksetzen“ (unload) nach dem Durchprobieren aller „n-mal“-Varianten den Zustand wieder genau auf den Stand vor diesem Item bringt (also nicht nur einmal entladen, wenn du es mehrfach geladen hast).\n\n### Code Style\n- Die `// TODO implement`-Kommentare sind teilweise nicht mehr passend (weil du schon implementiert hast); entferne/aktualisiere sie, damit der Code konsistent bleibt.\n- Kommentare sind teils abgebrochen/unklar („Welche Bedingungen müssen gelten, das …“). Formuliere sie entweder fertig oder lass sie weg, wenn sie keinen Mehrwert bieten.\n- `KnapsackN.main()` hat nicht die übliche Java-Signatur `main(String[] args)`; falls die Tests/Runner das erwarten, ist es besser, die Standardsignatur zu verwenden (auch wenn es für die Logik der Aufgabe nicht zentral ist).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `solved(...)`: Wenn ein Feld schon vorbelegt ist (`model.get(row,col) != 0`), gibst du nach dem rekursiven Aufruf immer `true` zurück, auch wenn der weitere Verlauf keine Lösung findet.\n- In `solved(...)`: Bei “keine Lösung gefunden” wird das Modell nicht zwingend in den Initialzustand zurückgesetzt (Anforderung: bei `false` soll das Sudoku wieder wie am Anfang sein); durch das falsche `true` bei vorbelegten Feldern kann ein teilweise gefülltes Board übrig bleiben.\n- `nofSolutions(...)` ist nicht implementiert und liefert immer `0`, damit wird die Anforderung “Anzahl Lösungen zählen (bis MAX) und Modell zurücksetzen” nicht erfüllt.\n- In `Sudoku.java`: `main` ist nicht `public static void main(String[] args)`, dadurch startet die Anwendung i.d.R. nicht wie erwartet.\n\n### Suggestion\n- Beim Fall “Feld ist vorbelegt”: Überlege dir, ob du das Ergebnis des rekursiven Aufrufs einfach weiterreichen musst, statt pauschal `true` zu liefern. Teste das gedanklich an einem Sudoku, das später in eine Sackgasse führt.\n- Um den Initialzustand bei `solved == false` sicherzustellen: Verfolge, welche Felder du selbst setzt/clearest, und stelle sicher, dass auf jedem Rücksprung-Pfad ohne Lösung deine eigenen Einträge wieder entfernt werden.\n- Für `nofSolutions`: Denk an Backtracking wie bei `solved`, aber statt “beim ersten Fund stoppen” zählst du alle Funde. Achte dabei darauf, dass du nach jedem getesteten Wert wieder “aufräumst” (clear) und dass du früh abbrechen kannst, sobald `MAX` erreicht ist.\n- Für `Sudoku.java`: Vergleiche die Methodensignatur mit dem Java-Entry-Point, den der JVM-Launcher erwartet.\n\n### Code Style\n- In `solved(...)` sind viele TODO-/Reflexions-Kommentare im Code; die würde ich nach dem Implementieren entfernen oder stark kürzen, damit die Logik leichter lesbar bleibt.\n- Magische Zahlen (`81`, `9`) sind fest verdrahtet; besser wäre, konsequent `model.size()` zu verwenden, damit es auch bei anderen Sudoku-Grössen korrekt/verständlich bleibt.\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" : "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" : "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
    } ]
  }
}