{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- `topWord()` gibt bei leerer Datenstruktur (`counts` ist leer, z.B. wenn nie `add` aufgerufen wurde) `null` zurück; laut Aufgaben-Skelett ist ein `String` als Rückgabe vorgesehen (im Template steht sogar `return \"\"`), d.h. dein Verhalten passt dann nicht zum erwartbaren Rückgabewert.\n\n### Suggestion\n- Überlege dir, was `topWord()` zurückgeben soll, wenn noch kein Wort hinzugefügt wurde, und behandle diesen Fall explizit (z.B. durch einen definierten “leeren” Rückgabewert statt `null`).\n\n### Code Style\n- Mach das Feld `counts` `private` (Kapselung), ggf. auch `final`, da die Map-Referenz nicht neu gesetzt wird.\n- Statt `Iterator` kannst du lesbarer über `counts.entrySet()` oder `counts.keySet()` mit einer for-each-Schleife iterieren (reduziert Boilerplate).\n- In `add()` rufst du `counts.get(word)` mehrfach auf; speichere den Wert einmal zwischen (macht den Code klarer und vermeidet doppelte Lookups).\n\n\n# Exercise: lotto\n\n### Correctness\n- In `buyTicket` erstellst du das `Ticket` mit `new Ticket(null, soldTickets, numbers)`; das Ticket muss aber eine Referenz auf die ausstellende `Lottery` haben, sonst kann es später die Gewinnzahlen nicht abfragen (und die Ticket-Methoden können so nicht korrekt funktionieren).\n- `draw()` in `Lottery` ist noch nicht implementiert, damit werden keine 6 zufälligen, verschiedenen Gewinnzahlen gezogen und gespeichert.\n- Die komplette `Ticket`-Implementierung fehlt noch: du speicherst die Zahlen nicht, und `getNumbers`, `getCorrectNumbers` sowie `getPrize` geben noch Platzhalter zurück; damit kann die App/Tests den Gewinn nicht berechnen.\n- Zustandsregeln sind noch nicht vollständig umgesetzt: `draw()` muss nach einer Ziehung eine `IllegalStateException` werfen (bei dir ist die Methode leer), und Tickets dürfen nach der Ziehung nicht mehr gekauft werden (das prüfst du zwar, aber nur über `winningNumbers != null` – das wird erst nach korrekt implementiertem `draw()` relevant).\n\n### Suggestion\n- Beim Erstellen des Tickets in `buyTicket`: überlege dir, welches Objekt im Moment gerade die Methode ausführt und daher als Lottery-Referenz im Ticket gespeichert werden sollte.\n- Für `draw()`: nimm eine Collection, die automatisch Duplikate verhindert, und füge so lange zufällige Zahlen hinzu, bis du genau 6 verschiedene hast; speichere diese dann in `winningNumbers` und blockiere erneutes Ziehen über den Zustand.\n- Für `Ticket`: ergänze eine Instanzvariable für die 6 Zahlen (Collection oder Array), initialisiere sie im Konstruktor, und gib in `getNumbers()` eine Kopie zurück (nicht die interne Datenstruktur).\n- Für `getCorrectNumbers()`: bilde die Schnittmenge aus Ticket-Zahlen und den Gewinnzahlen, aber achte darauf, dass du dabei nicht die Original-Gewinnzahlen der Lottery „kaputtmodifizierst“ (d. h. lieber mit einer Kopie arbeiten).\n- Für `getPrize()`: berechne zuerst, wie viele korrekte Zahlen vorliegen; implementiere dann die „Basisgewinn bei 1 Zahl, danach jeweils *20“ Logik anhand dieser Anzahl.\n\n### Code Style\n- In `buyTicket` sind viele Kommentare sehr umgangssprachlich/erklärend („man braucht for anweisung…“); kürzere, zielgerichtete Kommentare (oder selbsterklärender Code) wären hier besser.\n- In `buyTicket` machst du zwei Schleifen über `numbers` (einmal Range-Check, einmal Duplikate). Das ist nicht falsch, aber du könntest das auch in einem Durchlauf bündeln, um es kompakter zu halten.\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."
} ]
}
}