AutoFeedback API

Result 04e8421e-18be-4bab-b7bc-e74ef2a1a19a

{
  "llm" : {
    "feedback" : "# Exercise: textanalysis\n\n### Correctness\n- `topWord()` kann bei leerem Text bzw. wenn noch kein Wort mit `add` hinzugefügt wurde, nicht korrekt arbeiten: `Collections.max(...)` wirft dann eine Exception, statt ein Wort zurückzugeben.\n- Du hast die Wörter in `add()` auf lowercase normalisiert, aber der Exercise-Text verlangt das nicht; dadurch änderst du die tatsächlich zurückgegebene Wortform (z.B. „The“ vs „the“).\n\n### Suggestion\n- Überlege dir, was `topWord()` tun soll, wenn noch keine Wörter vorhanden sind (z.B. ein sinnvoller Rückgabewert oder eine definierte Behandlung dieses Falls), und prüfe das bevor du das Maximum bestimmst.\n- Entscheide dich bewusst, ob Groß-/Kleinschreibung berücksichtigt werden soll. Wenn du normalisieren willst, ist das ok, aber dann muss dir klar sein, dass `topWord()` nicht mehr das Originalwort aus dem Text zurückgeben kann.\n\n### Code Style\n- Sehr viele Debug-Ausgaben (`System.out.println(\"Adding word...\")`, `System.out.println(map.toString())`, `System.out.println(\"line:\" + line)`) machen die Ausgabe des Testprogramms unnötig laut; nimm sie raus oder nutze ein Logging-Konzept, das man deaktivieren kann.\n- Unbenutzte Imports in `WordCounter` (`java.security.Key`, `java.util.*` sehr breit) entfernen und stattdessen nur die tatsächlich verwendeten Klassen importieren.\n- In `TextAnalyzer` ist die zusätzliche Ausgabe pro Zeile nicht Teil der Aufgabe und stört das Ergebnisformat (insbesondere wenn ein automatischer Test läuft).\n- Du baust die Häufigkeits-Map erst in `topWord()` aus der Liste auf; effizienter und klarer ist es meist, die Häufigkeiten direkt beim `add()` in einer Map zu pflegen (dann musst du nicht jedes Mal alles neu zählen).\n\n\n# Exercise: lotto\n\n### Correctness\n- `Lottery.buyTicket` ist nicht implementiert und gibt immer `null` zurück; damit kann kein gültiges `Ticket` erstellt werden (inkl. ID-Vergabe 1,2,3,… und Validierung der 6 Zahlen).\n- Die Zustandsregel “nach der Ziehung dürfen keine Lose mehr gekauft werden” wird in `buyTicket` nicht umgesetzt (soll `IllegalStateException` werfen, sobald gezogen wurde).\n- Die Validierungsregeln für Ticketzahlen (genau 6 Zahlen, Bereich 1..maxNumber, alle verschieden) werden in `buyTicket` nicht geprüft und lösen daher auch keine `IllegalArgumentException` aus.\n- `Lottery.draw` ist nicht implementiert; damit werden keine 6 zufälligen verschiedenen Gewinnzahlen gezogen und gespeichert.\n- Die Zustandsregel “draw darf nur einmal aufgerufen werden” fehlt (soll nach bereits erfolgter Ziehung `IllegalStateException` werfen).\n- In `Ticket` fehlt die Speicherung der Ticket-Zahlen (keine Instanzvariable dafür) – damit können `getNumbers`, `getCorrectNumbers` und `getPrize` nicht korrekt arbeiten.\n- `Ticket.getNumbers` ist nicht implementiert und gibt `null` zurück, statt die 6 Zahlen (als Kopie) zu liefern.\n- `Ticket.getCorrectNumbers` ist nicht implementiert und gibt `null` zurück; außerdem muss diese Methode vor der Ziehung eine `IllegalStateException` auslösen.\n- `Ticket.getPrize` ist nicht implementiert und gibt immer `0` zurück; außerdem muss diese Methode vor der Ziehung eine `IllegalStateException` auslösen und danach den Gewinn gemäß Regel (0→0, 1→5, jede weitere Zahl *20) berechnen.\n\n### Suggestion\n- Implementiere `buyTicket` so, dass du zuerst den Zustand prüfst (ob bereits gezogen wurde) und dann die Eingabe validierst (Anzahl = 6, Wertebereich, keine Duplikate), bevor du `soldTickets` erhöhst und ein neues `Ticket` mit der nächsten ID erzeugst.\n- Für “6 verschiedene Zahlen” bietet sich eine Collection an, die Duplikate automatisch verhindert; vergleiche dann die Größe dieser Collection mit der erwarteten Anzahl.\n- Bei `draw`: Erzeuge eine leere Collection für `winningNumbers` und füge so lange Zufallszahlen im Bereich 1..maxNumber hinzu, bis genau 6 verschiedene vorhanden sind; denk daran, vorher den Zustand “noch nicht gezogen” zu prüfen.\n- Lege in `Ticket` eine Instanzvariable an, die die sechs Zahlen speichert (so, dass du später Duplikate/Lookup gut handhaben kannst) und befülle sie im Konstruktor aus dem übergebenen Array.\n- `getNumbers` sollte eine Kopie der gespeicherten Zahlen zurückgeben (nicht die interne Struktur direkt), damit der Aufrufer das Ticket nicht nachträglich “verändern” kann.\n- `getCorrectNumbers`: Hole dir die Gewinnzahlen über die Referenz auf `lottery` (das triggert auch automatisch die `IllegalStateException`, falls noch nicht gezogen wurde) und bilde die Schnittmenge mit den Ticketzahlen; gib das Ergebnis wieder als neues Array zurück.\n- `getPrize`: Nutze die Anzahl korrekter Zahlen als Basis und setze die Multiplikationsregel schrittweise um (bei 1 richtige Zahl Startwert, danach pro zusätzlicher richtiger Zahl multiplizieren).\n\n### Code Style\n- In deiner Abgabe sind die Kernmethoden noch als `// TODO`/Stub implementiert (mit `null`/`0` Returns); sobald du implementierst, entferne diese Platzhalter, damit klar ist, was final ist.\n- Achte darauf, dass Methoden, die “Kopie zurückgeben” sollen, wirklich nie interne Collections/Arrays direkt herausgeben (Defensivkopie konsequent).\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
    } ]
  }
}