{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- Deine `WordCounter`-Objekte unterhalten keine interne Datenstruktur, die die Häufigkeiten sammelt; stattdessen speicherst du nur alle Wörter in einer Liste und baust die Häufigkeits-Map erst in `topWord()` auf, obwohl die Aufgabe verlangt, dass beim schrittweisen `add` die relevante Information gesammelt wird.\n\n### Suggestion\n- Überlege dir eine Datenstruktur, in der du beim Aufruf von `add(word)` direkt den Zähler für dieses Wort aktualisierst, sodass `topWord()` nicht jedes Mal den ganzen Text erneut “nachzählen” muss.\n\n### Code Style\n- `import java.security.Key;` ist unbenutzt und sollte entfernt werden.\n- `import java.util.*;` ist sehr breit; besser nur die tatsächlich verwendeten Klassen importieren.\n- Der Kommentar `// TODO` in `topWord()` passt nicht mehr, weil dort bereits Logik implementiert ist; entweder entfernen oder anpassen.\n- `Collections.max(...)` ist okay, aber die Zwischenvariable `key` könnte direkt als `return ...;` geschrieben werden, um unnötige Zeilen zu vermeiden.\n\n\n# Exercise: lotto\n\n### Correctness\n- `Lottery.buyTicket`: Wenn eine Zahl ausserhalb von `1..maxNumber` liegt, wirfst du eine `IllegalStateException`; gefordert ist hier eine `IllegalArgumentException` (ungültige Eingabe, nicht falscher Zustand).\n- `Lottery.buyTicket`: Es fehlt die Zustandsprüfung „nach der Ziehung keine Tickets mehr verkaufen“ (wenn bereits gezogen wurde, muss eine `IllegalStateException` kommen).\n- `Lottery.draw`: Du prüfst nicht, ob bereits gezogen wurde; nach einer Ziehung darf `draw()` nicht nochmals aufgerufen werden und muss dann eine `IllegalStateException` werfen.\n- `Lottery.draw`: Bei einem gezogenen Duplikat machst du `return;` und beendest die Ziehung sofort → dadurch sind oft weniger als 6 Gewinnzahlen gespeichert.\n- `Ticket.getNumbers`: Gibt aktuell immer `null` zurück (und enthält eine leere `while`-Schleife), erfüllt also die Anforderung „6 Zahlen als Kopie zurückgeben“ nicht.\n- `Ticket.getCorrectNumbers`: Ruft selbst `lottery.draw()` auf (sogar zweimal) – das Ticket darf die Ziehung nicht auslösen, sondern soll nur nach einer Ziehung die Übereinstimmungen berechnen; ausserdem muss vor der Ziehung eine `IllegalStateException` kommen (die entsteht hier nicht kontrolliert/gezielt).\n- `Ticket.getCorrectNumbers`: Du gibst praktisch die Gewinnzahlen als Array zurück, nicht die Schnittmenge (korrekte Zahlen auf dem Ticket).\n- `Ticket.getPrize`: Preislogik stimmt nicht mit der Aufgabenbeschreibung überein (ab 2 richtigen Zahlen soll sich der Gewinn jeweils *verzwanzigfachen*; bei dir kommt z.B. für `win == 2` der Wert `3`).\n- `Ticket.getPrize`: Deine Zähl-Logik kann fehlschlagen, weil du `lottery.getWinningNumbers().size()` als Grenze nimmst, aber gleichzeitig `getCorrectNumbers()[j]` indexierst (das Array aus `getCorrectNumbers()` kann eine andere Länge haben als die Set-Grösse, je nachdem wie du es später korrekt implementierst).\n\n### Suggestion\n- Für die Zahlbereich-/Anzahl-/Duplikat-Prüfung in `buyTicket`: Überlege dir, welche Exception-Art zu „ungültige Parameter“ passt vs. „Methode im falschen Zustand aufgerufen“.\n- Für den Zustand „vor/nach Ziehung“: Nutze eine einzige, klare Quelle (z.B. ob `winningNumbers` gesetzt ist) und prüfe diese am Anfang von `buyTicket`, `draw`, `getWinningNumbers`, `getCorrectNumbers`, `getPrize`.\n- Für `draw()`: Statt beim Duplikat abzubrechen, musst du weiterziehen, bis wirklich 6 verschiedene Zahlen im Set sind.\n- Für `Ticket.getNumbers`: Gib eine Kopie zurück (nicht das interne Array direkt). Denk daran: Wenn der Aufrufer das zurückgegebene Array verändert, soll das Ticket intern unverändert bleiben.\n- Für `getCorrectNumbers`: Hol dir die gezogenen Gewinnzahlen von der Lottery (ohne neu zu ziehen) und bilde die Schnittmenge mit den Ticketzahlen.\n- Für `getPrize`: Berechne zuerst nur „wie viele Treffer“ (0..6). Danach baust du daraus den Gewinn gemäss Regel: bei 0 → 0, bei 1 → Basisbetrag, und für jede weitere korrekte Zahl nochmal mal Multiplikator.\n- Für die Trefferzählung in `getPrize`: Vermeide doppelte Schleifen über Array/Set-Indizes; überlege, wie du Membership-Checks mit einer passenden Collection (z.B. Set) einfacher und korrekt machen kannst.\n\n3. Code Style:\n- In `Lottery` sind `state` und die zusätzliche `id`-Variable redundant/irreführend, weil du bereits `soldTickets` hast und `hasDrawn()` über `winningNumbers` abbilden kannst.\n- Debug-Ausgaben (`System.out.println(...)`) in `draw()` und `getCorrectNumbers()` gehören nicht in die finale Lösung, da sie Tests/Output verfälschen können.\n- Unused imports: In `Lottery` ist `java.util.Arrays` unbenutzt.\n- `Ticket.getNumbers` enthält eine leere Endlosschleifen-Struktur (`while(numbers.length > 0){}`), die entfernt werden sollte.\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketsIllegalNumbers()",
"status" : "PASSED",
"message" : null
}, {
"name" : "draw()",
"status" : "FAILED",
"message" : "expected: <6> but was: <5>"
}, {
"name" : "drawNoDuplicates()",
"status" : "FAILED",
"message" : "expected: <6> but was: <4>"
}, {
"name" : "drawRandom()",
"status" : "FAILED",
"message" : "expected: <6> but was: <4>"
}, {
"name" : "drawAlreadyDrawn()",
"status" : "FAILED",
"message" : "Expected java.lang.Exception to be thrown, but nothing was thrown."
}, {
"name" : "getWinningNumbersNotDrawnYet()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketAlreadyDrawn()",
"status" : "FAILED",
"message" : "Expected java.lang.Exception to be thrown, but nothing was thrown."
} ]
}
}