AutoFeedback API

Result 7e6cc17f-2479-4cff-b443-25d32bb36106

{
  "llm" : {
    "feedback" : "# Exercise: textanalysis\n\n### Correctness\n- Deine interne Datenstruktur sammelt die Häufigkeiten nicht “nach und nach” beim `add`, sondern speichert nur alle Wörter und zählt erst in `topWord` aus. Das widerspricht der Idee/Anforderung, dass das Objekt die relevante Information während des Einlesens sammelt.\n\n### Suggestion\n- Überlege, welche Information du wirklich dauerhaft brauchst, um das häufigste Wort zu bestimmen: statt alle Wörter zu speichern, könntest du beim `add` direkt eine Zählstruktur aktualisieren, sodass `topWord` nur noch das Maximum aus dieser Struktur suchen muss.\n\n### Code Style\n- `import java.security.Key;` ist unbenutzt und sollte entfernt werden.\n- `import java.util.*;` ist sehr breit; besser gezielt nur die wirklich verwendeten Klassen importieren (z.B. `ArrayList`, `Map`, `HashMap`, `Collections`).\n- Der Kommentar `// TODO` in `topWord()` passt nicht mehr, weil die Methode bereits implementiert ist.\n\n\n# Exercise: lotto\n\n### Correctness\n- `buyTicket` gibt bei ungültigen Eingaben teilweise `null` zurück (z.B. falsche Anzahl Zahlen oder Zahl ausserhalb des Bereichs), statt wie gefordert eine `IllegalArgumentException` zu werfen.\n- `buyTicket` prüft den Zahlenbereich falsch: `if(numbers[i] < 1 && numbers[i] > maxNumber)` kann nie wahr sein; dadurch werden ungültige Zahlen nicht korrekt erkannt.\n- `buyTicket` verhindert den Kauf nach der Ziehung nicht (es fehlt die `IllegalStateException`, wenn bereits gezogen wurde).\n- Ticket-IDs starten nicht bei 1 und werden auch nicht über `soldTickets` vergeben; zudem wird `soldTickets` beim Verkauf nicht erhöht (Anforderung: erstes Ticket ID 1, dann 2, usw.).\n- `draw` wirft in deinem Code eine `IllegalStateException`, wenn *noch nicht* gezogen wurde; gefordert ist genau umgekehrt: nur wenn *schon* gezogen wurde, darf `draw` nicht nochmals ausgeführt werden.\n- `draw` initialisiert `winningNumbers` nie, wodurch keine Gewinnzahlen gespeichert werden können.\n- `draw`’s Schleifenbedingung `while(winningNumbers != null && ...)` verhindert die Ziehung genau dann, wenn `winningNumbers` noch `null` ist (also beim ersten Mal).\n- `draw` kann Zahlen ausserhalb des erlaubten Bereichs erzeugen (durch `rand.nextInt((maxNumber)+1)` entsteht auch 0).\n- `getNumbers` ist nicht implementiert und liefert immer `null` (und enthält zudem eine Endlosschleife).\n- `getCorrectNumbers` ist nicht korrekt: es ruft `lottery.draw()` auf (dadurch wird evtl. neu gezogen oder es knallt je nach Zustand) und es liefert am Ende immer `null`, statt die korrekten Zahlen zurückzugeben.\n- `getPrize` ist nicht implementiert (liefert immer 0) und berechnet den Gewinn nicht gemäss Vorgabe (5 CHF bei 1 Richtigen, danach jeweils *20-fach* pro weiterer richtiger Zahl).\n- Mehrere Methoden, die erst nach der Ziehung aufgerufen werden dürfen (`getCorrectNumbers`, `getPrize`), erzwingen diesen Zustand nicht sauber (bzw. verlassen sich nicht auf die geforderte `IllegalStateException`-Logik).\n\n### Suggestion\n- Überlege dir für `buyTicket`: Welche drei Validierungen sind zwingend (Anzahl=6, Bereich 1..maxNumber, alle verschieden) und was soll bei einem Verstoss passieren? Achte darauf, dass du wirklich *Exception wirfst* und nicht `null` zurückgibst.\n- Schau dir deine Bereichsprüfung an: Welche logische Verknüpfung brauchst du, damit “kleiner als 1 **oder** grösser als maxNumber” erkannt wird?\n- Für den Zustand “vor/nach Ziehung”: Du hast bereits `hasDrawn()` über `winningNumbers != null`. Versuche, diesen Zustand konsequent zu verwenden, statt ein zusätzliches `state`-Flag zu pflegen, das leicht inkonsistent wird.\n- Für `draw`: Stelle sicher, dass du beim ersten Ziehen eine passende Collection für `winningNumbers` erzeugst, dann so lange Zufallszahlen erzeugst, bis **6 verschiedene** gültige Zahlen drin sind.\n- Für Ticket-IDs: Prüfe, ob du eine bereits vorhandene Zählvariable (`soldTickets`) nutzen kannst, damit ID bei 1 beginnt und gleichzeitig die Anzahl verkaufter Tickets korrekt bleibt.\n- Für `Ticket.getNumbers`: Du sollst eine Kopie zurückgeben. Wenn du intern ein Array speicherst, denk daran, dass du es beim Zurückgeben kopierst (nicht dasselbe Array zurückgibst).\n- Für `getCorrectNumbers`: Diese Methode sollte nicht selbst ziehen. Sie soll nur die bereits gezogenen Gewinnzahlen abfragen und dann die Schnittmenge mit den Ticket-Zahlen bilden.\n- Für `getPrize`: Nimm als Grundlage die Anzahl korrekter Zahlen und baue daraus den Preis schrittweise auf (Basispreis bei 1 Treffer, dann pro zusätzlichem Treffer multiplizieren).\n\n### Code Style\n- Unnötige Imports in `Lottery` (`Arrays`) und Debug-Ausgaben (`System.out.println(winningNumbers)` / Zahlen ausgeben) entfernen; Tests erwarten normalerweise keine Konsolen-Ausgaben.\n- Das zusätzliche `state`-Flag macht den Code schwerer verständlich und widersprüchlich zu `winningNumbers != null`; lieber eine einzige Zustandsquelle verwenden.\n- Vermeide `return null` als “Fehlerfall” bei Methoden, deren Vertrag Exceptions fordert; das erschwert Debugging und führt später zu `NullPointerException`.\n- `getNumbers` enthält eine leere `while`-Schleife ohne Effekt (wirkt wie ein Überbleibsel) – das sollte weg, sobald du die Methode korrekt implementierst.\n",
    "status" : "SUCCESS"
  },
  "unitTest" : {
    "tests" : [ {
      "name" : "buyTicketIds()",
      "status" : "FAILED",
      "message" : "expected: <1> but was: <0>"
    }, {
      "name" : "buyTicketsIllegalNumbers()",
      "status" : "FAILED",
      "message" : "Expected java.lang.Exception to be thrown, but nothing was thrown."
    }, {
      "name" : "draw()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawNoDuplicates()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawRandom()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawAlreadyDrawn()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "getWinningNumbersNotDrawnYet()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "buyTicketAlreadyDrawn()",
      "status" : "FAILED",
      "message" : null
    } ]
  }
}