{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- In `topWord()` gibst du `bestWord` bereits innerhalb der `for`-Schleife zurück; dadurch wird nur der erste Eintrag der Map betrachtet und nicht wirklich das häufigste Wort über alle Wörter hinweg ermittelt.\n- Wenn die Map leer ist, gibst du aktuell `\"\"` zurück; dein übriger Code deutet aber darauf hin, dass du eigentlich konsistent `bestWord` zurückgeben möchtest (und nicht je nach Pfad einmal `bestWord`, einmal `\"\"`).\n\n### Suggestion\n- Prüfe die Klammerung/Position deines `return bestWord;`: Die Entscheidung, welches Wort am häufigsten ist, kann erst nach dem Durchlaufen aller Einträge sicher getroffen werden.\n- Überlege dir einen einheitlichen Rückgabepfad für `topWord()`: Was soll passieren, wenn noch kein Wort hinzugefügt wurde? Richte danach die Initialwerte und das finale `return` aus.\n\n### Code Style\n- `wordAdd` ist als Name etwas missverständlich für eine Map mit Häufigkeiten; ein Name wie `counts`, `wordCounts` o.ä. macht die Rolle der Struktur klarer.\n- Ein paar Einrückungen/Leerzeilen sind inkonsistent (z.B. in `add`), was das Lesen erschwert.\n\n\n# Exercise: lotto\n\n### Correctness\n- `Lottery.buyTicket` ist nicht implementiert und gibt aktuell immer `null` zurück; damit kann kein gültiges `Ticket` gekauft werden (IDs werden nicht vergeben/hochgezählt, Validierung fehlt, State-Check fehlt).\n- `Lottery.draw` ist nicht implementiert; damit werden nie 6 verschiedene Gewinnzahlen gezogen/gespeichert und der Zustand „nach Ziehung“ wird nie erreicht.\n- `Ticket` speichert die übergebenen Zahlen nirgends (fehlende Instanzvariable + Zuweisung im Konstruktor); dadurch können `getNumbers`, `getCorrectNumbers` und `getPrize` nicht korrekt funktionieren.\n- `Ticket.getNumbers` ist nicht implementiert und gibt `null` zurück; gefordert ist, alle Ticket-Zahlen zurückzugeben (als Kopie).\n- `Ticket.getCorrectNumbers` ist nicht implementiert und gibt `null` zurück; gefordert ist, nach der Ziehung die Schnittmenge aus Ticketzahlen und Gewinnzahlen zurückzugeben und vor der Ziehung eine `IllegalStateException` zu werfen.\n- `Ticket.getPrize` ist nicht implementiert und gibt immer `0` zurück; gefordert ist die Berechnung anhand der Anzahl korrekter Zahlen (0 → 0, 1 → 5, jede weitere ×20).\n\n### Suggestion\n- In `buyTicket`: Denk an den Lotterie-Zustand („vor/nach draw“) und wirf eine `IllegalStateException`, wenn bereits gezogen wurde; danach prüfst du die Eingabe auf **genau 6 Werte**, **Bereich 1..maxNumber** und **keine Duplikate** (ein Set eignet sich gut zum Prüfen).\n- Für die Ticket-ID: Verwende `soldTickets` als Zähler, erhöhe ihn beim erfolgreichen Verkauf und nutze den neuen Wert als ID (Start muss bei 1 liegen).\n- In `draw`: Lege eine Collection für `winningNumbers` an und fülle sie per Zufall so lange, bis **6 verschiedene** Zahlen drin sind; danach muss `hasDrawn()` true sein und ein zweiter `draw()`-Aufruf soll scheitern (`IllegalStateException`).\n- In `Ticket`: Entscheide dich für eine passende Datenstruktur (z.B. `HashSet<Integer>` oder Liste) als Instanzvariable und kopiere die `numbers` aus dem Konstruktor hinein (nicht einfach das Array referenzieren, sonst wäre es von außen veränderbar).\n- In `getNumbers`: Gib eine **Kopie** deiner gespeicherten Zahlen zurück (nicht die interne Collection/Referenz).\n- In `getCorrectNumbers`: Hole die Gewinnzahlen über die `lottery`-Referenz (damit kommt automatisch die `IllegalStateException` vor der Ziehung) und bilde dann die Schnittmenge mit den Ticketzahlen, ohne die internen Daten kaputt zu machen.\n- In `getPrize`: Nutze die Anzahl korrekter Zahlen als Basis; prüfe, dass du die „×20 pro weitere korrekte Zahl“-Regel wirklich iterativ/über eine Potenz umsetzt.\n\n### Code Style\n- In mehreren Methoden sind noch `// TODO` + Dummy-Returns (`null`, `0`); das führt schnell zu `NullPointerException` in `LotteryApp` (z.B. bei `Arrays.toString(tic.getCorrectNumbers())` bzw. `tic.getPrize()`), sobald du diese Stellen nicht mehr nur in Tests, sondern im App-Lauf verwendest.\n- Die JavaDocs in `Ticket.getNumbers` sprechen von „ArrayList“, die Signatur gibt aber ein `Integer[]` zurück; achte darauf, dass Kommentar und Rückgabetyp konsistent bleiben (oder passe nur den Kommentar an, nicht die Signatur).\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "FAILED",
"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" : null
} ]
}
}