AutoFeedback API

Result 64ba21da-ad4e-473c-869a-ec9e6b2ccb24

{
  "llm" : {
    "feedback" : "# Exercise: textanalysis\n\n### Correctness\n\n\n### Suggestion\n\n\n### Code Style\n- Du importierst `Map`, verwendest es aber nur für `Map.Entry` im Loop; das ist ok, aber du könntest auch konsistent `var` oder den konkreten Typ verwenden, damit der Stil einheitlicher ist.\n- In `topWord()` initialisierst du `topWord` mit `null`, gibst aber bei leerer Map `\"\"` zurück. Das ist funktional zwar okay, aber inkonsistent in der Ausdrucksweise (entweder immer `\"\"` als “kein Ergebnis” oder immer `null`), damit Aufrufer klar wissen, was sie erwarten können.\n\n\n# Exercise: lotto\n\n### Correctness\n- `Lottery.buyTicket` ist nicht implementiert und gibt immer `null` zurück; dadurch können keine Tickets korrekt gekauft werden (inkl. ID-Vergabe/Validierung/Zustandsprüfung).\n- `Lottery.draw` ist nicht implementiert; es werden nie 6 zufällige verschiedene Gewinnzahlen gezogen und gespeichert.\n- Im `Ticket`-Konstruktor werden die übergebenen Zahlen nicht gespeichert; ohne Instanzvariable dafür können spätere Methoden nicht korrekt funktionieren.\n- `Ticket.getNumbers` ist nicht implementiert und gibt `null` zurück; damit kann weder `toString` noch die App sinnvoll arbeiten.\n- `Ticket.getCorrectNumbers` ist nicht implementiert; das Ticket kann keine richtigen Zahlen bestimmen (inkl. Zustand “erst nach draw”).\n- `Ticket.getPrize` ist nicht implementiert; die Gewinnberechnung gemäss Vorgabe (0→0, 1→5, jede weitere Zahl *20) fehlt.\n- Die geforderten Zustandsregeln (“vor/nach Ziehung”) sind in den nicht implementierten Methoden noch nicht umgesetzt (z.B. `buyTicket` nach `draw`, `draw` nur einmal, Ticket-Methoden erst nach `draw`).\n\n### Suggestion\n- Implementiere in `buyTicket` zuerst die Zustandsprüfung über `hasDrawn()` und wirf bei “nach Ziehung” eine `IllegalStateException`, bevor du irgendetwas am Ticketzählstand änderst.\n- Für die Validierung der Ticketzahlen: prüfe (1) Array-Länge genau 6, (2) jede Zahl im Bereich `1..maxNumber`, (3) keine Duplikate – für (3) eignet sich eine `Set`-Struktur, bei der du beim Einfügen merkst, ob etwas schon vorhanden ist.\n- Denk daran, die Ticket-ID fortlaufend zu vergeben: erhöhe den Zähler genau dann, wenn das Ticket wirklich gültig ist, und verwende diesen Wert als ID.\n- In `draw`: erzwinge “nur einmal ziehen” (z.B. wenn `winningNumbers != null`), initialisiere dann eine Collection und füge solange Zufallszahlen hinzu, bis es genau 6 verschiedene sind.\n- Lege im `Ticket` eine Instanzvariable für die 6 Zahlen an (z.B. `Set`), kopiere die `numbers` aus dem Konstruktor hinein (nicht einfach Referenz übernehmen), damit das Ticket “immutable” bleibt.\n- `getNumbers` sollte eine Kopie zurückgeben (wie in der Aufgabenbeschreibung), nicht die interne Datenstruktur; überlege, wie du aus deiner internen Collection wieder ein `Integer[]` erzeugst.\n- `getCorrectNumbers`: hole dir die Gewinnzahlen über die Lottery-Referenz (das erzwingt automatisch den “erst nach draw”-Zustand, wenn du `getWinningNumbers()` nutzt) und bilde dann die Schnittmenge mit deinen Ticketzahlen, ohne dabei deine internen Ticketzahlen zu verändern.\n- `getPrize`: nutze die Anzahl korrekter Zahlen als Basis; prüfe die Fälle 0/1 getrennt und steigere dann pro weiterer korrekter Zahl mit dem Multiplikator (ohne den exakten Code auszuformulieren: es läuft auf wiederholtes Multiplizieren hinaus).\n\n### Code Style\n- In allen TODO-Methoden stehen aktuell Platzhalter-Returns (`null`/`0`); sobald du implementierst, entferne diese konsequent, damit keine “versteckten” Null-Rückgaben übrig bleiben.\n- Achte darauf, dass `toString()` nicht indirekt `NullPointerException` auslöst (passiert aktuell, weil `getNumbers()` `null` liefert); nach der Implementierung von `getNumbers()` erledigt sich das.\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
    } ]
  }
}