{
"llm" : {
"feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du bei jedem Rekursionsschritt immer ein Rechteck und hörst erst bei `n < 0` auf; dadurch wird auch für `n == 0` noch weiter rekursiv aufgerufen (mit `n == -1` als Abbruch), was nicht dem geforderten Basisfall-Verhalten entspricht.\n- In `Boxes.drawRec` fehlt der vierte Teil (unten links). In der Aufgabenidee werden vier Quadranten behandelt; bei dir werden nur drei rekursiv gezeichnet.\n- In `Triangles.drawRec` zeichnest du in jedem Rekursionsschritt das große Dreieck erneut und rufst dann weiter rekursiv auf; auch hier ist der Abbruch erst bei `n < 0`, d.h. für `n == 0` werden trotzdem noch Unter-Dreiecke gezeichnet, statt nur das Basisdreieck.\n- In `Triangles.drawRec` wird durch das Zeichnen in jedem Rekursionsschritt nicht die gewünschte rekursive Zerlegung “nur bis zur Tiefe n” erreicht, sondern es überlagern sich Linien aller Ebenen (das weicht vom typischen rekursiven Muster mit “zeichne nur im Basisfall” ab).\n\n### Suggestion\n- Überlege dir einen klaren Basisfall für `n == 0`: Was genau soll dann gezeichnet werden, und was soll *nicht* mehr passieren (keine weiteren Rekursionsaufrufe).\n- Prüfe bei den Boxes die vier Teilquadrate: Wenn du `s` halbierst, welche `(x,y)`-Offsets brauchst du für **alle** vier Quadranten? Einer davon fehlt aktuell.\n- Bei den Triangles: Entscheide dich, ob du Linien **nur** im Basisfall zeichnen willst (und sonst nur unterteilen), oder ob du bewusst jede Ebene zeichnen willst. Vergleiche das mit dem Zielbild/der typischen Sierpinski-Zerlegung: Welche Ebene soll welche Dreiecke zeichnen?\n- Teste dein `n` gezielt: Lass `n=0` laufen und schaue, ob wirklich nur “eine Form” (ein Quadrat bzw. ein Dreieck) entsteht. Wenn bei `n=0` schon mehrere Formen erscheinen, stimmt die Rekursionslogik/Basisfall noch nicht.\n\n### Code Style\n- Vermeide “Magic Conditions” wie `n < 0` als Abbruch; ein sauberer, gut lesbarer Basisfall (z.B. exakt für `n == 0`) macht die Rekursion verständlicher.\n- In `Triangles.drawRec` sind die vielen Midpoint-Berechnungen inline wiederholt; das wird schnell unübersichtlich. Zwischenspeichern in gut benannten Variablen würde Lesbarkeit deutlich verbessern.\n- Auskommentierter Code (`//drawRec(...)`) sollte entfernt werden, sobald du die finale Variante hast, sonst erschwert es das Review.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `KnapsackN` ist die `main`-Signatur falsch: Du hast `static void main()` statt `static void main(String[] args)`. Falls die Tests/Runner eine echte Java-Entry-Point erwarten, startet das Programm so nicht.\n\n### Suggestion\n- Schau dir an, wie Java den Programmeinstieg findet: welche `main`-Methode wird vom JVM-Launcher akzeptiert? Passe die Signatur entsprechend an, ohne die restliche Logik zu ändern.\n\n### Code Style\n- In `pack` sind viele `TODO`-Kommentare und erklärende Kommentare, die nicht mehr zum finalen Stand passen; räum die auf, sobald du fertig bist, damit die Struktur klarer bleibt.\n- Du verwendest zwei Schleifen zum „Rückgängig machen“; das funktioniert, ist aber unnötig umständlich zu lesen—überlege, ob du das Zurücksetzen pro Ebene kompakter ausdrücken kannst (ohne die Logik zu ändern).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `nofSolutions(...)` wird das `max`-Limit nicht korrekt in die Rekursion weitergegeben: du rufst rekursiv immer mit demselben `max` auf, statt das verbleibende Budget zu berücksichtigen. Dadurch kann das Resultat am Ende größer als `MAX` werden, obwohl laut Interface nach spätestens `MAX` gefundenen Lösungen abgebrochen werden soll.\n- In `Sudoku.java` ist `main()` nicht als Java-Entry-Point implementiert (`public static void main(String[] args)` fehlt). Damit startet die Applikation so nicht wie vorgesehen.\n\n### Suggestion\n- Überlege dir bei `nofSolutions`: Wenn du bereits `zähler` Lösungen gefunden hast und weitere Lösungen suchst, wie viele “dürfen” dann maximal noch gefunden werden, damit du insgesamt nicht über `max` kommst? Genau diesen Restwert solltest du beim rekursiven Aufruf verwenden.\n- Prüfe in `Sudoku.java`, welche Methodensignatur die JVM beim Starten eines Programms erwartet, und passe Sichtbarkeit (`public`) und `static` entsprechend an.\n\n### Code Style\n- Vermeide Umlaute in Variablennamen (z.B. `zähler`), das kann je nach Tooling/Encoding unnötige Probleme machen; nimm besser ASCII-Namen.\n- Viele Kommentare wiederholen 1:1, was der Code bereits ausdrückt (z.B. “Umrechnung von fieldNr…”); lieber nur dort kommentieren, wo die Idee/Invariant wichtig ist (Abbruchbedingung, Backtracking-Schritt, Limit-Handling).\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" : "PASSED",
"message" : null
}, {
"name" : "random3()",
"status" : "PASSED",
"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
} ]
}
}