AutoFeedback API

Result 1bd18977-addb-40e6-84fd-1c49c3eadaf6

{
  "llm" : {
    "feedback" : "# Exercise: textanalysis\n\n### Correctness\n- In `add(String word)` setzt du bei einem neuen Wort den Zähler auf `0`; damit wird das erste Auftreten nicht mitgezählt (ein Wort, das einmal vorkommt, hat danach bei dir Häufigkeit 0 statt 1). Dadurch kann `topWord()` ein falsches Ergebnis liefern.\n\n### Suggestion\n- Überlege dir, welche Zahl in der Map stehen soll, **direkt nachdem ein Wort zum ersten Mal hinzugefügt wurde**. Prüfe dazu gedanklich oder mit einem Mini-Test: `add(\"a\")` → welche Häufigkeit erwartest du für `\"a\"`? Passe dann die Initialisierung im `else`-Zweig entsprechend an.\n\n### Code Style\n- Mach das Feld `wordList` besser `private`, damit die interne Datenstruktur wirklich gekapselt ist.\n- Java-Konventionen: Variablennamen lokal eher `topWord` statt `TopWord`, und `startValue` statt `startvalue` (camelCase).\n- Du rufst in der Schleife teils mehrfach `wordList.get(...)` auf; einen lokalen Zwischenspeicher pro Iteration macht den Code leichter lesbar.\n\n\n# Exercise: lotto\n\n### Correctness\n- `Lottery.draw()` ist noch nicht implementiert; damit werden keine 6 zufälligen, verschiedenen Gewinnzahlen gezogen/gespeichert und mehrere Tests können nicht bestehen.\n- In `Ticket` sind Konstruktor (Speichern der Zahlen) sowie `getNumbers()`, `getCorrectNumbers()` und `getPrize()` noch nicht implementiert; damit kann das Los weder seine Zahlen noch die korrekten Zahlen noch den Gewinn liefern.\n- In `Lottery.buyTicket()` wird nicht verhindert, dass der Caller nach dem Kauf das übergebene `Integer[] numbers` nachträglich verändert und dadurch das Ticket „mitverändert“ (Requirement: Ticketzahlen sollen später nicht änderbar sein, daher defensiv kopieren).\n- In `Lottery.buyTicket()` wird bei doppelten Zahlen erst am Ende geprüft (`differentNumbers.size()`), aber es wird nicht sofort als ungültig erkannt; je nach Unit-Test-Erwartung kann das relevant sein (insbesondere wenn explizit „alle Zahlen verschieden“ als Validierungsregel pro Zahl geprüft wird).\n\n### Suggestion\n- Für `draw()`: Überlege dir eine Collection, die automatisch keine Duplikate zulässt, und fülle sie so lange mit Zufallszahlen im Bereich `1..maxNumber`, bis genau 6 verschiedene drin sind; setze danach den Zustand so, dass ein zweites Ziehen eine `IllegalStateException` auslöst.\n- Für `Ticket`: Lege eine Instanzvariable für die 6 Zahlen an (Collection oder Array) und speichere im Konstruktor eine Kopie der Eingabe, nicht die originale Referenz.\n- Für `getNumbers()`: Gib immer eine Kopie deiner intern gespeicherten Zahlen zurück, damit der Aufrufer die Ticketzahlen nicht verändern kann.\n- Für `getCorrectNumbers()`: Nutze die Gewinnzahlen aus der zugehörigen `Lottery` (über die Referenz im Ticket). Den State-Check bekommst du „gratis“, wenn du über eine Methode gehst, die vor der Ziehung bereits `IllegalStateException` wirft.\n- Für `getPrize()`: Berechne zuerst wie viele korrekte Zahlen vorhanden sind; starte bei 0 korrekt mit 0 CHF, bei 1 korrekt mit `BASE_PRIZE`, und pro weiterer korrekter Zahl multiplizierst du den aktuellen Gewinn mit `MULTIPLIER` (ohne eine feste Tabelle hart zu codieren).\n- Für die Duplikatsprüfung in `buyTicket()`: Wenn du beim Durchlaufen der Zahlen beim Einfügen in ein Set erkennst, dass die Zahl schon vorhanden ist, kannst du direkt als ungültig abbrechen statt erst am Ende über die Set-Größe zu gehen.\n\n### Code Style\n- In `buyTicket()` ist `nextNumberCounter` redundant: Wenn du sowieso genau 6 Elemente iterierst und bei ungültigen sofort wirfst, reicht es, am Ende nur noch „Set hat Größe 6“ zu prüfen (oder besser: Duplikate direkt beim Einfügen erkennen).\n- Die verschachtelten `if/else`-Blöcke in `buyTicket()` sind recht tief; mit „guard clauses“ (frühe `throw`s) wird die Methode leichter lesbar.\n- Die `// TODO`-Kommentare, die bereits erledigt sind (z.B. in `buyTicket()`), solltest du entfernen, damit klar ist, was wirklich noch offen ist.\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."
    } ]
  }
}