{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- In `add`, when a word is seen for the first time you store `0` as its count; that means every word is counted one too low, and a word that appears exactly once will never “beat” the initial maximum in `topWord`.\n\n### Suggestion\n- Think about what the stored integer should represent (e.g., “number of occurrences seen so far”). For a new word, initialize it to the count after the first sighting, not before.\n\n### Code Style\n- Make `wordList` `private` (and ideally `final`) to encapsulate the internal data structure.\n- Use Java naming conventions for variables/method locals (e.g., `topWord`/`startValue` rather than `TopWord`/`startvalue`).\n- Add a space after `if` (`if (wordList.containsKey(word)) { ... }`) for readability.\n\n\n# Exercise: lotto\n\n### Correctness\n- In `buyTicket` prüfst du nicht alle 6 Zahlen: deine `for`-Schleife läuft nur bis `< 5`, d. h. du validierst nur 5 Einträge und lässt einen komplett ungeprüft.\n- Deine Bedingungen können nie erfüllt werden: Du verlangst `nextNumberCounter == 5` und gleichzeitig `differentNumbers.size() == 6` – mit nur 5 verarbeiteten Zahlen kann das Set nicht Größe 6 erreichen.\n- Du prüfst nicht korrekt auf “6 verschiedene Zahlen”: Du fügst zwar in ein `HashSet` ein, aber du reagierst nicht darauf, wenn eine Zahl doppelt vorkommt (außer indirekt über die unmögliche `size()==6`-Bedingung).\n- Wenn die Eingabe ungültig ist, gibst du am Ende `null` zurück statt zuverlässig eine `IllegalArgumentException` zu werfen (z. B. bei doppelten Zahlen oder wenn deine Bedingungen nicht erfüllt sind).\n- `Lottery.draw()` ist noch nicht implementiert, dadurch werden keine 6 zufälligen, verschiedenen Gewinnzahlen gezogen und gespeichert.\n- `Ticket` ist noch nicht fertig: Konstruktor speichert die Zahlen nicht; `getNumbers`, `getCorrectNumbers`, `getPrize` sind noch `TODO`. Damit funktionieren App/Demo und die Tests zur Ticket-Logik nicht.\n- Die Zustandsregeln fehlen noch an mehreren Stellen: z. B. muss `draw()` nach einer Ziehung eine `IllegalStateException` werfen (und `buyTicket()` nach der Ziehung hast du zwar begonnen, aber Gesamtzustandslogik ist noch unvollständig, weil Ticket-Methoden ebenfalls erst nach `draw()` funktionieren dürfen).\n\n### Suggestion\n- Schau dir die Schleifen-Grenze in `buyTicket` an: überlege, wie du sicherstellst, dass wirklich alle 6 Array-Elemente geprüft werden.\n- Überlege, wie du “alle verschieden” sauber prüfst: Ein `Set` hilft, aber dann musst du die Set-Größe sinnvoll mit der Anzahl gelesener Zahlen vergleichen (und/oder schon beim Einfügen Duplikate erkennen).\n- Achte darauf, dass `buyTicket` bei jedem ungültigen Fall per Exception endet und nicht “still” `null` liefert; prüfe die Kontrollflüsse (wo landest du, wenn eine Bedingung nicht erfüllt ist?).\n- Für `draw()`: nutze eine Collection, die automatisch Duplikate verhindert, und ziehe so lange, bis wirklich 6 Elemente drin sind; zusätzlich vorab den “schon gezogen?”-Zustand prüfen.\n- Für `Ticket`: entscheide dich für eine passende Collection als Instanzvariable, kopiere die Eingabezahlen in diese Struktur im Konstruktor, und gib in `getNumbers()` immer eine Kopie zurück.\n- Für `getCorrectNumbers()`: nutze die Gewinnzahlen aus der `Lottery` und bilde die Schnittmenge mit den Ticket-Zahlen; dabei daran denken, dass der Aufruf vor der Ziehung eine `IllegalStateException` auslösen muss (direkt oder indirekt).\n- Für `getPrize()`: leite den Gewinn ausschließlich aus der Anzahl korrekter Zahlen ab und setze die “*20 pro weitere Zahl*”-Regel Schritt für Schritt um.\n\n### Code Style\n- In `buyTicket` sind Variablen wie `nextNumberCounter`/`number` etwas umständlich; du könntest die Logik klarer machen, wenn du direkt über die Werte iterierst statt per Index und Zähler zu arbeiten.\n- Das `return null` am Ende ist in so einer Validierungs-Methode ein “Code-Smell”: besser ist ein eindeutiger Kontrollfluss, bei dem entweder ein Ticket zurückkommt oder eine Exception fliegt (sonst werden Fehler später als `NullPointerException` sichtbar).\n- Entferne die `// TODO`-Marker, sobald du die Stellen umgesetzt hast, damit man leichter sieht, was wirklich noch fehlt.\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
} ]
}
}