{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- `topWordK(int k)` erfüllt nicht die Zusatzanforderung: Dort ist mit „k-häufigsten“ die Rangliste gemeint (z.B. k=1 → häufigstes Wort, k=2 → zweit-häufigstes Wort), bei dir bedeutet `k` aktuell „genau k-mal vorkommend“.\n- Die Signatur/Sichtbarkeit von `topWordK` passt nicht zu deiner Verwendung in `TextAnalyzer`: In `TextAnalyzer` rufst du `counter.topWordK(42)` auf, aber in `WordCounter` ist die Methode nicht `public`. Das kann (je nach Test/Package-Kontext) zu Zugriffsproblemen führen.\n\n### Suggestion\n- Überlege dir, was „k-häufigsten“ konkret bedeutet: Du brauchst dafür nicht Wörter mit Frequenz == k, sondern du musst die Wörter nach Häufigkeit sortieren/auswählen und dann das Element auf Position k bestimmen (oder die Top-k-Liste zurückgeben).\n- Wenn du `topWordK` von außerhalb der Klasse nutzen willst (wie im Analyzer), dann prüfe, welche Sichtbarkeit die Methode haben muss, damit der Aufruf sicher klappt.\n\n### Code Style\n- `words` sollte als Feld typischerweise `private` sein, damit die interne Datenstruktur gekapselt bleibt.\n- In `topWord()` sind Variablennamen wie `x` und `y` wenig aussagekräftig; bessere Namen machen den Code leichter verständlich (z.B. für „maxCount“, „currentWord“).\n- In `add()` machst du zwei Map-Zugriffe (`containsKey` + `get`); das lässt sich mit einem einzigen Zugriff einfacher/lesbarer ausdrücken (ohne die Logik zu ändern).\n- In `TextAnalyzer` ist die Ausgabe „Words that appear 42 times:“ irreführend im Kontext der Zusatzaufgabe, weil sie deine aktuelle Interpretation von `topWordK` widerspiegelt, nicht die eigentliche „Top-k“-Bedeutung.\n\n\n# Exercise: lotto\n\n### Correctness\n- In `Lottery.draw()` verwendest du `r.nextInt(1, 43)` statt den Bereich über `maxNumber` abzuleiten; damit funktioniert die Lotterie nicht korrekt, sobald `Lottery` mit einem anderen `maxNumber` als 42 erstellt wird.\n- In `Lottery.buyTicket(...)` prüfst du nicht explizit, dass **genau** 6 Zahlen übergeben wurden (z.B. Länge 5 oder 7). Deine `HashSet`-Grössenprüfung fängt einiges ab, aber die Anforderung „genau 6 Zahlen vorhanden“ sollte unabhängig von Duplikaten gelten (und bei 7 Zahlen ohne Duplikate würde es bei dir zwar scheitern, aber die Prüfung ist nicht als explizite Längenprüfung umgesetzt).\n\n### Suggestion\n- Nutze in `draw()` konsequent `maxNumber`, um den Zufallsbereich zu bestimmen, statt fix 42/43 zu codieren; überlege dir, wie du aus `maxNumber` einen inklusiven Bereich `1..maxNumber` generierst.\n- Ergänze in `buyTicket(...)` eine eigene Prüfung der Array-Länge, bevor du die Werte/Einzigartigkeit prüfst; dann ist klar getrennt, ob „falsche Anzahl Zahlen“ oder „Duplikate/ungültige Werte“ das Problem sind.\n\n### Code Style\n- Entferne den unbenutzten Import `ch.fhnw.prog1.exercise.lotto.LotteryApp;` in `Lottery.java`.\n- Verwende für Konstanten konsequent `BASE_PRIZE` und `MULTIPLIER` auch in `Ticket.getPrize()` statt der Magic Numbers `5` und `20`.\n- In `Ticket` könntest du `numbers` als `final` deklarieren, da du die Referenz nach dem Konstruktor nicht mehr neu setzt.\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "FAILED",
"message" : null
}, {
"name" : "buyTicketsIllegalNumbers()",
"status" : "PASSED",
"message" : null
}, {
"name" : "draw()",
"status" : "FAILED",
"message" : null
}, {
"name" : "drawNoDuplicates()",
"status" : "FAILED",
"message" : "expected: <true> but was: <false>"
}, {
"name" : "drawRandom()",
"status" : "FAILED",
"message" : "expected: <true> but was: <false>"
}, {
"name" : "drawAlreadyDrawn()",
"status" : "FAILED",
"message" : "Unexpected exception type thrown, expected: <java.lang.IllegalStateException> but was: <java.lang.reflect.UndeclaredThrowableException>"
}, {
"name" : "getWinningNumbersNotDrawnYet()",
"status" : "FAILED",
"message" : "Unexpected exception type thrown, expected: <java.lang.IllegalStateException> but was: <java.lang.reflect.UndeclaredThrowableException>"
}, {
"name" : "buyTicketAlreadyDrawn()",
"status" : "FAILED",
"message" : null
} ]
}
}