AutoFeedback API

Result 796692df-bc01-4cbf-9905-aaa6b75b17c2

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Boxes.drawRec` zeichnest du in der Rekursion alle vier Quadranten rekursiv weiter; in der Aufgaben-/Beispielfigur wird unten links **nicht** weiter rekursiv unterteilt, sondern nur als einfaches Rechteck gezeichnet (dadurch entsteht das „fehlende“/anders strukturierte Teilstück im Muster).\n- `Triangles.drawRec` erzeugt nicht die gleiche rekursive Zerlegung wie gefordert (Sierpinski-artig): Du startest deine drei Teilrekursionen jeweils an den Original-Eckpunkten `x0/x1/x2` und kombinierst sie mit Mittelpunkten; dadurch überlappen/duplizieren sich Bereiche und das „Loch“ in der Mitte entsteht nicht korrekt.\n\n### Suggestion\n- Boxes: Überlege dir, welche der vier Teilflächen bei `n > 0` wirklich nochmals rekursiv weitergehen sollen und welche stattdessen direkt im Basisfall gezeichnet werden kann, auch wenn `n` noch nicht 0 ist.\n- Triangles: Berechne zuerst konsequent die drei Seitenmittelpunkte (für jede Kante genau einen). Nutze diese dann, um **drei** kleinere Dreiecke zu definieren, die die Ecken-Dreiecke bilden (oben, unten links, unten rechts). Achte darauf, dass jedes der drei rekursiven Dreiecke genau die richtigen drei Punkte bekommt (jeweils eine Original-Ecke + zwei passende Mittelpunkte), statt immer „Original-Ecke + zwei Mittelpunkte, die nicht zusammengehören“.\n\n### Code Style\n- In `Triangles.drawRec` ist das `else` nach dem `return` im `if (n==0)` nicht nötig; das macht den Code etwas verschachtelter als nötig.\n- Die Kommentare `// TODO implement` sind in `Triangles` noch drin, obwohl du schon implementiert hast; die könntest du entfernen, damit klar ist, dass es fertig ist.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `KnapsackN`, die `main`-Methode hat nicht die übliche Signatur `main(String[] args)`. Falls die mitgelieferten Tests/Runner genau diese Signatur erwarten, wird das Programm nicht gestartet.\n\n### Suggestion\n- Vergleiche die erwartete Einstiegsmethode (wie sie in Java üblicherweise oder in der Vorlage verwendet wird) mit deiner `main`-Deklaration und passe nur die Methodensignatur an, ohne die Logik zu ändern.\n\n### Code Style\n- In `pack` ist die Verschachtelung mit zwei inneren Schleifen (k-mal laden/entladen) funktional, aber etwas schwer zu lesen und ineffizient. Überlege dir, ob du das „k Stück auf einmal“ gedanklich/strukturell klarer kapseln kannst (z.B. indem du das Laden/Entladen für `k` an einer Stelle bündelst), damit die Rekursion leichter nachvollziehbar bleibt.\n- Der Kommentar `// Item 0 bis maxN mal versuchen` ist okay, aber du könntest ihn präzisieren (es geht um „aktuelles Item i“), damit beim Lesen klar ist, dass es pro Index passiert.\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `Sudoku.java` ist die `main`-Methode nicht als Java-Entry-Point definiert (`public static void main(String[] args)`), dadurch startet das Programm nicht wie erwartet.\n- `nofSolutions` respektiert die geforderte Obergrenze `SudokuSolver.MAX` nicht: du rufst `nofSolutions(model, 0, Integer.MAX_VALUE)` auf, womit das Abbrechen nach MAX Lösungen nicht garantiert ist.\n- `nofSolutions` setzt das Modell am Ende nicht zwingend auf den Initialzustand zurück, wie es im Interface verlangt ist: bei vorgefüllten Feldern wird nie etwas verändert, aber bei selbst gesetzten Feldern wird nur das jeweils aktuelle Feld zurückgesetzt; wenn du früher wegen `count >= max` zurückkehrst, muss sichergestellt sein, dass auf allen Rekursionsebenen die eigenen Einträge wieder gelöscht sind (sonst kann ein Teilzustand „liegen bleiben“).\n\n### Suggestion\n- Schau dir die Signatur an, die Java als Startpunkt erwartet, und vergleiche sie mit deiner `main`-Methode: welche zwei Modifikatoren und welcher Parameter fehlen?\n- Überlege bei `nofSolutions`, wofür `SudokuSolver.MAX` gedacht ist: wo solltest du diese Konstante in deinen ersten Aufruf „einspeisen“, damit die Zählung automatisch begrenzt ist?\n- Verfolge einmal gedanklich (oder mit Debugger) den Pfad, bei dem `count >= max` eintritt: bist du dann sicher, dass **jede** Rekursionsebene, die ein Feld gesetzt hat, dieses Feld wieder cleart, bevor sie zurückkehrt? Wenn nicht: an welcher Stelle könntest du die Rücksetz-Logik so platzieren, dass sie unabhängig vom Rückgabepfad passiert?\n\n### Code Style\n- In `SudokuSolverImpl.nofSolutions` verwendest du `Integer.MAX_VALUE` als „magische“ Obergrenze; nimm dafür lieber die dafür vorgesehene Konstante aus dem Interface (macht die Intention sofort klar).\n- Du deklarierst in `SudokuSolverImpl` mehrfach `int size = model.size();` in jeder Rekursion; das ist ok, aber wenn du Lesbarkeit verbessern willst, könntest du den Ausdruck an zentraler Stelle halten oder als `final` markieren, um die Unveränderlichkeit zu betonen.\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
    } ]
  }
}