{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- In `add(String word)` setzt du bei einem neuen Wort den Zähler auf `0`; dadurch wird das erste Vorkommen nicht gezählt (ein Wort, das genau einmal vorkommt, bleibt bei 0 statt 1), und alle Häufigkeiten sind um 1 zu klein.\n\n### Suggestion\n- Überlege dir, welchen Wert ein Wort beim *allerersten* Auftreten haben muss, damit die Anzahl Vorkommen korrekt ist, und passe den `else`-Zweig in `add` entsprechend an.\n\n### Code Style\n- `wordList` sollte `private` sein (Kapselung), damit nicht von außen direkt in die interne Datenstruktur eingegriffen werden kann.\n- Variablennamen wie `TopWord` (großes T) wirken wie Klassennamen; verwende für lokale Variablen konsistente camelCase-Namen (z.B. `topWord`, `maxCount`), das verbessert Lesbarkeit.\n\n\n# Exercise: lotto\n\n### Correctness\n- In `Ticket` fehlen der Konstruktor-Teil zum Speichern der Zahlen sowie die Implementationen von `getNumbers`, `getCorrectNumbers` und `getPrize`; damit kann der Client-Code (z. B. `toString()`, `LotteryApp.reportOutcome()`) nicht korrekt funktionieren.\n- `buyTicket` gibt das `Ticket` zwar nur vor der Ziehung aus, aber weil `Ticket` noch keine Zahlen speichert/liefern kann, ist das Gesamtsystem gemäss Aufgabenanforderung unvollständig.\n- In `draw()` verwendest du `Random.nextInt(1, maxNumber + 1)`. Das gibt es nicht in allen Java-Versionen (je nach Kurs/Setup), wodurch die Tests/Abgabeumgebung scheitern kann, obwohl die Logik stimmt.\n\n### Suggestion\n- Für `Ticket`: Lege eine Instanzvariable für die 6 Zahlen an (Collection aus dem Java Collection Framework) und fülle sie im package-private Konstruktor. Achte darauf, dass spätere Änderungen von aussen nicht deine internen Ticket-Zahlen verändern können.\n- Für `getNumbers()`: Gib nicht die interne Struktur direkt zurück, sondern eine Kopie (so wie es in der Aufgabenbeschreibung verlangt ist).\n- Für `getCorrectNumbers()`: Du kannst die Gewinnzahlen über die `lottery`-Referenz abfragen; wenn noch nicht gezogen wurde, soll dabei eine `IllegalStateException` entstehen. Danach musst du die Schnittmenge aus Ticket-Zahlen und Gewinnzahlen bestimmen.\n- Für `getPrize()`: Leite den Gewinn nur aus der Anzahl korrekter Zahlen ab (0 → 0, 1 → 5, danach jeweils *20 pro zusätzlicher korrekter Zahl). Nutze dabei die Konstanten aus `Lottery`.\n- Für `draw()`: Wenn du kompatibel bleiben willst, verwende eine Variante der Zufallszahl-Erzeugung, die sicher in der erwarteten Java-Version vorhanden ist, und mappe sie dann auf den Bereich `1..maxNumber`.\n\n### Code Style\n- Unnötiger Import in `Lottery`: `java.util.random.RandomGenerator` wird nicht verwendet.\n- In `draw()` ist der Kommentar `// TODO` stehen geblieben, obwohl die Methode implementiert ist.\n- In `buyTicket()` ist die Verschachtelung durch viele `if/else` relativ tief; frühzeitige Fehlerbehandlung (guard clauses) würde die Lesbarkeit verbessern.\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketsIllegalNumbers()",
"status" : "PASSED",
"message" : null
}, {
"name" : "draw()",
"status" : "FAILED",
"message" : "RemoteException occurred in server thread; nested exception is: \n\tjava.rmi.RemoteException: ch.fhnw.prog1.exercise.lotto.impl.LotteryWrapperImpl"
}, {
"name" : "drawNoDuplicates()",
"status" : "FAILED",
"message" : "Sandbox has not been injected"
}, {
"name" : "drawRandom()",
"status" : "FAILED",
"message" : "Sandbox has not been injected"
}, {
"name" : "drawAlreadyDrawn()",
"status" : "PASSED",
"message" : null
}, {
"name" : "getWinningNumbersNotDrawnYet()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketAlreadyDrawn()",
"status" : "PASSED",
"message" : null
} ]
}
}