AutoFeedback API

Result cbc307c0-7d88-45ec-9f24-523997736ae0

{
  "llm" : {
    "feedback" : "# Exercise: fractal\n\n### Correctness\n- In `Fractal.java` ist die `main`-Methode als `static void main(...)` deklariert, aber nicht `public`. Damit wird das Programm in vielen Umgebungen nicht als Startpunkt erkannt (es muss die Java-Signatur `public static void main(String[] args)` sein).\n\n### Suggestion\n- Vergleiche die erwartete Java-Entry-Point-Signatur mit deiner Deklaration: die JVM sucht explizit nach einer `public static void main(String[] args)`-Methode in der Startklasse.\n\n### Code Style\n- In `Triangles.drawRec(...)` berechnest du dieselben Mittelpunkte mehrfach direkt in den Argumenten. Das macht den Code schwer lesbar und fehleranfälliger; speichere die Zwischenwerte (z.B. die drei Kantenmittelpunkte) einmal in Variablen und verwende sie dann.\n- In `Triangles.drawRec(...)` ist in einem der rekursiven Aufrufe die y-Koordinate eines Mittelpunkts direkt `y2` (statt ein Mittelwert wie bei den anderen Punkten). Das ist zwar nicht zwingend falsch, wirkt aber inkonsistent und erschwert das Nachvollziehen; konsistente Benennung/Variablen würden solche Ausrutscher schneller sichtbar machen.\n\n\n# Exercise: knapsack\n\n### Correctness\n- In `pack(i)` you only update `maxValue` when `i == weights.length`. If the current weight already exceeds `maxWeight`, you stop exploring, but you also don’t record the best value that may have been reached on a valid earlier level of recursion in that branch; this can miss valid candidates depending on how the recursion reaches the overweight state.\n- Your recursion keeps adding items up to `maxN` times even if `currWeight` already exceeds `maxWeight` in the middle of the loop (you only check `currWeight <= maxWeight` before entering the loop). This means you explore states that violate the weight constraint, which can lead to incorrect pruning behavior (and failing tests if they expect pruning at the right time).\n\n### Suggestion\n- Consider checking the weight constraint *after each* `loadItem(i)` (or before recursing further) so you don’t continue building on already invalid states.\n- Think about when a partial solution should be considered for `maxValue`: do you really want to only consider solutions when `i` has reached the end, or should you also consider the case where you cannot (or should not) proceed further because of the weight limit?\n\n### Code Style\n- The structure in `pack(i)` is a bit hard to read with the interleaved `pack(i + 1)` and `loadItem(i)` inside the same loop; separating the “try k copies (including 0)” idea more explicitly would improve readability.\n- In `KnapsackN`, `main()` is missing the usual `String[] args` parameter (not required by the interface here, but it’s non-standard for a Java entry point and may confuse tooling).\n\n\n# Exercise: sudoku\n\n### Correctness\n- In `solved(...)` werden nach einem erfolgreichen rekursiven Aufruf weiter Werte ausprobiert, weil du in der Schleife nicht stoppst, sobald `done` true ist; dadurch kann eine bereits gefundene Lösung wieder überschrieben werden.\n- In `solved(...)` wird das Feld am Ende nicht zuverlässig geleert, wenn **alle** ausprobierten Werte fehlschlagen (du clearest nur im `else`-Fall von `oneOK`, aber nicht nachdem die Schleife komplett durch ist und `done` weiterhin false ist).\n- `nofSolutions(...)` ist noch nicht implementiert und liefert immer `0`, damit ist Anforderung 4 nicht erfüllt.\n\n### Suggestion\n- Überlege dir in der Wert-Schleife: Was soll passieren, sobald die Rekursion eine Lösung meldet? Prüfe, ob du dann die Schleife sofort beenden bzw. die weiteren Versuche verhindern musst.\n- Denk an das typische Backtracking-Muster: “Wert setzen → prüfen → rekursiv versuchen → wenn nicht erfolgreich, wieder rückgängig machen”. Achte darauf, dass das Rückgängigmachen auch dann passiert, wenn *kein* Wert zum Erfolg geführt hat (also nach der ganzen Schleife).\n- Für `nofSolutions`: Du brauchst eine sehr ähnliche Rekursion wie bei `solved`, aber statt `boolean` zählst du die gefundenen Lösungen auf. Zusätzlich musst du die Suche abbrechen, sobald du `MAX` (bzw. `max` im Parameter) erreicht hast, und das aktuelle Feld nach dem Durchprobieren wieder leeren.\n\n### Code Style\n- In `solved(...)` sind die Zahlen `9`, `10` und `81` hart codiert; nutze dafür lieber `model.size()` (und `model.size()*model.size()`), damit der Code nicht unnötig von einer fixen 9x9-Annahme abhängt.\n- Die Variablennamen `x`/`y` sind etwas verwirrend, weil sie eigentlich Zeile/Spalte sind; sprechendere Namen (z.B. `i`/`j`) würden das Lesen erleichtern.\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
    } ]
  }
}