{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- Deine interne Datenstruktur sammelt nicht „relevante Information“ beim Hinzufügen: In `add` speicherst du nur alle Wörter in einer Liste und baust die Häufigkeiten erst in `topWord` neu auf, statt die Häufigkeiten inkrementell beim Hinzufügen zu pflegen.\n\n### Suggestion\n- Überlege, welche Information du wirklich brauchst, um das häufigste Wort zu bestimmen (nicht die komplette Wortliste), und wie du diese Information bereits in `add` aktualisieren kannst, sodass `topWord` nur noch auswerten muss, was schon gesammelt wurde.\n\n### Code Style\n- `import java.security.Key;` ist unbenutzt und sollte entfernt werden.\n- `import java.util.*;` ist sehr breit; üblich ist, nur die tatsächlich verwendeten Klassen zu importieren.\n- In `topWord` ist der Kommentar `// TODO` irreführend, weil die Methode bereits implementiert ist.\n\n\n# Exercise: lotto\n\n### Correctness\n- `buyTicket` gibt bei ungültigen Zahlen (z. B. Duplikate oder ausserhalb des Bereichs) `null` zurück, statt wie gefordert eine `IllegalArgumentException` zu werfen.\n- `buyTicket` erlaubt aktuell weiterhin Ticket-Käufe, auch wenn bereits gezogen wurde; gefordert ist hier eine `IllegalStateException`.\n- Die Ticket-IDs starten bei dir mit `0` (und nicht mit `1`), und `soldTickets` wird beim Verkauf nicht erhöht; beides widerspricht der Anforderung („erstes Ticket ID 1, dann 2, …“ und `getSoldTickets()` soll das widerspiegeln).\n- `draw()` ist nicht implementiert; damit werden keine 6 zufälligen, verschiedenen Gewinnzahlen gezogen/gespeichert.\n- `draw()` prüft nicht den Zustand „schon gezogen“ und wirft daher nicht wie gefordert eine `IllegalStateException`, wenn nochmal gezogen wird.\n- `Ticket` speichert die Zahlen nicht (Konstruktor TODO), und `getNumbers`, `getCorrectNumbers`, `getPrize` sind nicht implementiert; damit kann das Ticket weder Zahlen zurückgeben noch korrekte Zahlen/Preis berechnen.\n- `Ticket.getCorrectNumbers()` und `Ticket.getPrize()` müssen vor der Ziehung eine `IllegalStateException` auslösen; das Verhalten ist aktuell nicht umgesetzt (Methoden sind noch TODO/Default-Werte).\n\n### Suggestion\n- Überlege dir in `buyTicket`, an welchen Stellen du *sofort* abbrechen musst: Sobald eine der Validierungsregeln fehlschlägt, sollte nicht „weitergemacht“ werden, sondern direkt eine Exception kommen (statt am Ende `null` zurückzugeben).\n- Schau dir an, wie du den Zustand „vor/nach draw“ zentral nutzt: Du hast mit `hasDrawn()` schon eine gute Abfrage, die du in `buyTicket` und `draw` als Guard verwenden kannst.\n- Für die IDs: Statt eine separate `id`-Variable zu führen, könntest du dich daran orientieren, dass es bereits `soldTickets` gibt und die ID-Regel exakt dazu passt (Startwert/Increment beachten).\n- Für `draw()`: Du brauchst eine Datenstruktur, die automatisch „keine Duplikate“ zulässt, und du füllst sie so lange, bis 6 verschiedene Zahlen drin sind.\n- Für `Ticket`: Lege eine Instanzvariable für die Ticket-Zahlen an (Collection/Array) und gib in `getNumbers()` immer eine Kopie zurück, damit niemand die internen Zahlen verändern kann.\n- Für `getCorrectNumbers()`: Nutze die Gewinnzahlen aus der zugehörigen `lottery`-Referenz und bilde die Schnittmenge mit den Ticketzahlen; vorher sicherstellen, dass überhaupt schon gezogen wurde.\n- Für `getPrize()`: Arbeite nur mit der *Anzahl* korrekter Zahlen und setze die geforderte Progression um (0 → 0, 1 → BASE_PRIZE, jede weitere Zahl → mal MULTIPLIER).\n\n### Code Style\n- `System.out.println(numbers.length);` in `buyTicket` ist Debug-Ausgabe und gehört nicht in die finale Abgabe.\n- `t.getNumbers();` in `buyTicket` hat keinen Effekt (Rückgabewert wird ignoriert) und wirkt wie ein Überbleibsel aus einem Test/Debugging.\n- Unnötige Imports in `Lottery` (`Arrays`, `HashSet` wird zwar gebraucht, aber `Arrays` aktuell nicht; je nach finaler Implementierung aufräumen).\n- Du hast sowohl `soldTickets` als auch `id` als Zähler – das ist verwirrend; besser eine einzige Quelle für die Ticketnummerierung verwenden.\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "FAILED",
"message" : "expected: <1> but was: <0>"
}, {
"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."
} ]
}
}