{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- `topWord()` gibt bei noch nicht hinzugefügten Wörtern (`add` nie aufgerufen) `null` zurück; die Methode soll ein Wort zurückgeben (im Template ist ein leerer String als Platzhalter gezeigt), d.h. du brauchst ein definiertes Verhalten für den “leer”-Fall.\n\n### Suggestion\n- Überlege dir, was `topWord()` liefern soll, wenn keine Wörter gezählt wurden (z.B. leerer String oder eine andere klar definierte Rückgabe) und stelle sicher, dass du dann nicht einfach `null` ausgibst.\n\n### Code Style\n- In `add` machst du pro Wort mehrere Map-Zugriffe (`containsKey`, dann `put`, dann wieder `get`); das lässt sich lesbarer und mit weniger Zugriffen ausdrücken, wenn du den alten Wert einmal holst und darauf aufbaust (oder eine passende Map-Utility-Methode nutzt).\n- `mostCommonWord` ist ein internes Cache-Feld; ein kurzer Kommentar (warum es existiert und wann es gültig ist) würde die Intention für Leser klarer machen.\n\n\n# Exercise: lotto\n\n### Correctness\n- `Lottery.buyTicket`: Du prüfst nicht, dass **genau 6 Zahlen übergeben** wurden (Array-Länge). Mit einem Array mit z.B. 7 Einträgen (davon 6 gültige/verschiedene) würde deine Methode aktuell trotzdem ein Ticket verkaufen.\n- `Lottery.buyTicket`: Deine Validierung ist nicht gemäss Anforderung: **Ungültige Zahlen** (z.B. 0, -1, > maxNumber) werden bei dir einfach ignoriert, statt dass sofort eine `IllegalArgumentException` geworfen wird.\n- `Lottery.buyTicket`: Du stellst nicht sicher, dass die **6 Zahlen alle verschieden sind als Eingabe-Bedingung**, sondern erreichst `size()==6` nur indirekt; dadurch werden Fälle mit Duplikaten/ungültigen Zahlen nicht immer so behandelt, wie die Spezifikation es verlangt (Fehler statt “still ok wenn am Ende 6 übrig bleiben”).\n- `Lottery.draw` ist nicht implementiert (muss 6 zufällige, verschiedene Gewinnzahlen ziehen und den State korrekt setzen).\n- `Ticket`: Konstruktor speichert die Zahlen nicht; `getNumbers`, `getCorrectNumbers` und `getPrize` sind nicht implementiert, damit kann das Programm/Tests den Gewinn nicht berechnen.\n- `Ticket.getCorrectNumbers` / `Ticket.getPrize`: Es fehlt die geforderte **State-Logik** (vor der Ziehung `IllegalStateException`), weil die Methoden aktuell noch leer sind.\n\n### Suggestion\n- In `buyTicket`: Überlege dir eine Reihenfolge der Checks: zuerst “darf man überhaupt noch kaufen?” (State), dann “sind es exakt 6 Eingaben?”, dann für **jede** Zahl: Bereich prüfen und gleichzeitig Duplikate erkennen; bei der **ersten** Verletzung direkt abbrechen.\n- Für ungültige Zahlen: Statt sie “wegzufiltern” solltest du sie als Fehler behandeln, damit Eingaben wie `{1,2,3,4,5,999}` nicht plötzlich als “zu wenig Zahlen” oder “irgendwie ok” durchgehen.\n- Für `draw`: Du brauchst eine Struktur, die automatisch keine Duplikate zulässt, und du musst so lange ziehen, bis genau 6 verschiedene Zahlen drin sind; zusätzlich vor dem Ziehen prüfen, ob schon gezogen wurde.\n- Für `Ticket`: Lege eine Instanzvariable für die 6 Ticket-Zahlen an (Collection oder Array), initialisiere sie im Konstruktor, und gib in `getNumbers` immer eine Kopie zurück.\n- Für `getCorrectNumbers`: Nutze die Gewinnzahlen aus der zugehörigen `lottery` und bilde die Schnittmenge mit den Ticket-Zahlen; achte darauf, dass du dabei **nicht** die intern gespeicherten Gewinnzahlen der Lottery veränderst.\n- Für `getPrize`: Berechne den Gewinn nur aus der Anzahl korrekter Zahlen (0 → 0, 1 → `BASE_PRIZE`, danach jeweils mit `MULTIPLIER` weiter); rufe dabei nicht mehrfach teure Logik unnötig oft auf.\n\n### Code Style\n- In `Lottery.java` ist `import java.util.List;` unbenutzt und kann entfernt werden.\n- In `buyTicket` wäre ein klarerer Name als `numSet`/`numbers` hilfreich (z.B. “seen”/“uniqueNumbers”), damit die Absicht (Duplikat-Check) sofort ersichtlich ist.\n- Einheitliche Klammer-/Spacing-Formatierung (z.B. `if (hasDrawn()) { ... }`) verbessert Lesbarkeit, auch wenn es funktional nichts ändert.\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."
} ]
}
}