AutoFeedback API

Result 7b83c94b-b12e-4a5e-8bb8-7a0735bfe7d0

{
  "llm" : {
    "feedback" : "# Exercise: textanalysis\n\n### Correctness\n- In `add`, du schreibst mit `wordCounts.put(word, 1)` den Zähler immer zuerst auf `1`, bevor du überhaupt prüfst, ob das Wort schon existiert. Dadurch wird ein bereits vorhandener Zähler zunächst überschrieben und du verlierst Information (die Häufigkeiten werden nicht korrekt gezählt).\n\n### Suggestion\n- Schau dir den Rückgabewert von `Map.put(key, value)` genau an: Er liefert dir den *alten* Wert (oder `null`). Überlege dir eine Reihenfolge, bei der du den alten Wert ausliest, ohne ihn vorher schon durch `1` zu ersetzen, und dann abhängig davon den neuen Wert setzt. Alternativ: Es gibt in `Map` auch Methoden, die “increment if present else init” direkt ausdrücken.\n\n### Code Style\n- Verwende Generics auch beim Konstruktor: `new HashMap<>()` statt `new HashMap()`, sonst bekommst du Raw-Type-Warnungen.\n- Mach das Feld `wordCounts` am besten `private`, damit die interne Datenstruktur wirklich gekapselt ist.\n- In `add` hast du aktuell unnötig viele `put`-Aufrufe; das macht den Code schwerer lesbar und führt hier auch zum Fehler.\n\n\n# Exercise: lotto\n\n### Correctness\n- `Lottery.buyTicket` ist nicht implementiert und gibt immer `null` zurück; damit wird kein gültiges `Ticket` erstellt, keine ID vergeben und keine Validierung der 6 Zahlen (Anzahl, Bereich, Verschiedenheit) durchgeführt.\n- `Lottery.draw` ist nicht implementiert; es werden keine 6 zufälligen, verschiedenen Gewinnzahlen gezogen und gespeichert, und der Zustand „nach der Ziehung“ wird nie erreicht.\n- In `Ticket` fehlt die geforderte Speicherung der Ticketzahlen in einer Instanzvariablen; dadurch können die Ticketzahlen später nicht korrekt zurückgegeben/verglichen werden.\n- `Ticket.getNumbers` ist nicht implementiert und gibt `null` zurück; damit verletzt du die Anforderung, die 6 Zahlen zurückzugeben (als Kopie).\n- `Ticket.getCorrectNumbers` ist nicht implementiert und gibt `null` zurück; damit kann nicht ermittelt werden, welche Zahlen mit den Gewinnzahlen übereinstimmen, und die geforderte `IllegalStateException` vor der Ziehung wird auch nicht umgesetzt.\n- `Ticket.getPrize` ist nicht implementiert (liefert immer 0); damit wird die geforderte Gewinnlogik (0→0, 1→5, danach jeweils *20) nicht erfüllt und auch die Zustandsprüfung vor der Ziehung fehlt.\n\n### Suggestion\n- Fang bei `buyTicket` damit an, zuerst den Zustand zu prüfen („darf man nach `draw()` noch kaufen?“) und erst danach die Eingabe zu validieren; überlege dir dann, wie du die Ticket-ID aus `soldTickets` ableitest und hochzählst.\n- Für die Validierung der 6 Zahlen: Denk an drei Checks (genau 6 Elemente, jede Zahl im erlaubten Bereich, keine Duplikate). Eine Collection, die Duplikate automatisch verhindert, kann dir beim dritten Check helfen.\n- Für `draw`: Du brauchst eine Datenstruktur, die nur verschiedene Gewinnzahlen enthält, und eine Schleife, die so lange Zufallszahlen erzeugt, bis genau 6 verschiedene drin sind; vergiss nicht, vor einem zweiten `draw()` den illegalen Zustand zu erkennen.\n- In `Ticket`: Lege eine Instanzvariable für die Zahlen an (Collection oder Array) und speichere im Konstruktor eine Kopie/Übernahme der übergebenen Zahlen, damit spätere Änderungen am Parameter-Array dir nicht das Ticket „verfälschen“.\n- `getNumbers`: Gib nicht die interne Datenstruktur direkt zurück, sondern eine Kopie (bei Collections z.B. neue Collection/Array erzeugen), damit Client-Code die Ticketzahlen nicht nachträglich verändern kann.\n- `getCorrectNumbers`: Überlege, wie du aus „Ticket-Zahlen“ ∩ „Gewinnzahlen“ die Schnittmenge bildest, ohne die internen Daten der Lottery oder des Tickets zu verändern; die Zustandsprüfung kannst du indirekt über die Lottery erzwingen (oder selbst prüfen).\n- `getPrize`: Nutze die Anzahl korrekter Zahlen als Grundlage; prüfe die Fälle 0 und ≥1 getrennt und bilde dann den Faktor *20 für jede weitere korrekte Zahl nach der ersten.\n\n### Code Style\n- In allen TODO-Methoden lieferst du aktuell `null`/`0`; solange du implementierst, ist das ok, aber achte darauf, dass `toString()` über `getNumbers()` sonst schnell zu `NullPointerException` führt (auch beim Debuggen/Printen).\n- Es fehlen aktuell passende Imports (z.B. `Random`, falls du es für `draw()` verwendest); füge sie erst hinzu, wenn du die jeweilige Implementierung machst, damit keine toten Imports entstehen.\n",
    "status" : "SUCCESS"
  },
  "unitTest" : {
    "tests" : [ {
      "name" : "buyTicketIds()",
      "status" : "FAILED",
      "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" : null
    } ]
  }
}