AutoFeedback API

Result 967d7246-fbc0-4b12-9883-d41214b64ea2

{
  "llm" : {
    "feedback" : "# Exercise: textanalysis\n\n### Correctness\n\n\n### Suggestion\n\n\n### Code Style\n- Du hältst dieselbe Information doppelt (einmal in `list`, einmal in `set`). Für grosse Texte wird das schnell speicherintensiv und auch unnötig kompliziert.\n- Die aktuelle Lösung zählt in `topWord()` sehr ineffizient (verschachtelte Schleifen: für jedes unterschiedliche Wort einmal durch die ganze Liste). Das funktioniert zwar, skaliert aber schlecht bei “grösseren Texten”, wie in der Aufgabe erwähnt. Eine Datenstruktur, die die Häufigkeit beim `add()` direkt mitführt, macht `topWord()` deutlich einfacher/performanter.\n- Kommentare `// TODO` sind noch drin, obwohl du die Stellen bereits implementiert hast.\n\n\n# Exercise: lotto\n\n### Correctness\n- In `Lottery.buyTicket`: Wenn nicht genau 6 Zahlen übergeben werden (z.B. 5 oder 7), muss laut Aufgabenstellung eine `IllegalArgumentException` geworfen werden; bei dir wird bei `< 6` eine `IllegalStateException` geworfen und `> 6` wird gar nicht abgewiesen.\n- In `Lottery.buyTicket`: Für ungültige Zahlenbereiche (kleiner 1 / grösser `maxNumber`) und doppelte Zahlen verlangt die Aufgabe ebenfalls `IllegalArgumentException`; bei dir wird dafür `IllegalStateException` verwendet.\n- In `Lottery.draw`: Du speicherst die gezogenen Zahlen nicht im Objektzustand (`this.winningNumbers`). Du erstellst eine lokale Variable `var winningNumbers = new HashSet<>();`, die nach Methodenende verloren geht. Dadurch bleibt `hasDrawn()` weiterhin `false` und `getWinningNumbers()` wirft weiterhin eine Exception.\n- In `Lottery.draw`: `rand.nextInt(1, this.maxNumber)` zieht Werte im Bereich `[1, maxNumber)` (oberes Ende exklusiv). Damit kann `maxNumber` selbst nie gezogen werden, was gegen “zwischen 1 und der Höchstzahl” verstösst.\n- In `Ticket.getPrize`: Bei genau 1 korrekten Zahl muss der Gewinn 5 CHF sein; bei dir kommt für `length == 1` 0 heraus.\n\n### Suggestion\n- Schau in der Aufgabenbeschreibung/JavaDoc von `buyTicket`, welche Exception-Art für “ungültige Eingaben” vs. “falscher Zustand (nach draw)” gefordert ist, und unterscheide diese beiden Fälle.\n- Prüfe in `buyTicket` explizit auf “genau 6” (nicht nur “mindestens 6”) bevor du die Inhalte validierst.\n- In `draw`: Achte darauf, dass du die gezogenen Zahlen in das Instanzfeld schreibst (nicht in eine lokale Variable), damit der Zustand “nach der Ziehung” wirklich erreicht wird und `getWinningNumbers()` danach funktioniert.\n- Überprüfe bei `Random.nextInt(...)` genau, ob die obere Grenze inklusive oder exklusive ist, und passe die Berechnung so an, dass `maxNumber` auch tatsächlich vorkommen kann.\n- In `getPrize`: Geh die Preisregel noch einmal Schritt für Schritt durch (0→0, 1→5, dann jede weitere korrekte Zahl *20) und stelle sicher, dass der Fall “genau 1 richtig” nicht in deinen “sonst 0”-Zweig fällt.\n\n### Code Style\n- In `Lottery.buyTicket` steht noch `// TODO`, obwohl du schon implementiert hast – entweder entfernen oder TODO wirklich offen lassen.\n- In `Lottery.draw` ist `var winningNumbers` als lokale Variable unglücklich benannt, weil es das Feld `winningNumbers` verdeckt; das erhöht Verwechslungsgefahr.\n- In `Ticket.java` ist der Import `java.util.HashSet;` und `java.util.ArrayList;` ok, aber generell könntest du ungenutzte Imports prüfen (bei dir wirkt aktuell alles genutzt).\n",
    "status" : "SUCCESS"
  },
  "unitTest" : {
    "tests" : [ {
      "name" : "buyTicketIds()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "buyTicketsIllegalNumbers()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "draw()",
      "status" : "FAILED",
      "message" : "expected: <true> but was: <false>"
    }, {
      "name" : "drawNoDuplicates()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawRandom()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawAlreadyDrawn()",
      "status" : "FAILED",
      "message" : "Expected java.lang.Exception to be thrown, but nothing was thrown."
    }, {
      "name" : "getWinningNumbersNotDrawnYet()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "buyTicketAlreadyDrawn()",
      "status" : "FAILED",
      "message" : "Expected java.lang.Exception to be thrown, but nothing was thrown."
    } ]
  }
}