{
"llm" : {
"feedback" : "# Exercise: address\n\n### Correctness\n- In `setZipCode` erlaubst du `zipCode == 0` (durch `>= 0`), gefordert ist aber „positiv“ (also strikt größer als 0).\n- Die Vierstelligkeitsprüfung über `String.valueOf(zipCode).length() == 4` akzeptiert auch Werte, die zwar 4 Zeichen lang sind, aber nicht zwingend im Bereich einer vierstelligen positiven Zahl geprüft werden (die Anforderung ist „positiv und vierstellig“ als Zahlenbedingung).\n\n### Suggestion\n- Schau dir in `setZipCode` den Vergleichsoperator an: Wenn „positiv“ gefordert ist, sollte 0 durch die Validierung fallen.\n- Überlege bei der Vierstelligkeit, ob du statt einer String-Längenprüfung lieber direkt mit einem Zahlenbereich arbeitest (damit die Bedingung „vierstellig“ eindeutig als Zahleneigenschaft formuliert ist).\n\n### Code Style\n- `throw new IllegalArgumentException();` ohne Nachricht ist ok, aber eine kurze Fehlermeldung pro Feld (z.B. welches Argument ungültig ist) macht das Debugging deutlich einfacher.\n- Die Validierungslogik ist teilweise doppelt/uneinheitlich (Strings über Helper, Zahlen inline). Du könntest die Checks konsistenter strukturieren (z.B. auch für `zipCode` eine eigene kleine Prüfmethode), um Lesbarkeit zu erhöhen.\n\n\n# Exercise: timespan\n\n### Correctness\n- Der Konstruktor setzt `hours`/`minutes` direkt, ohne Preconditions zu prüfen; damit kann `totalMinutes()` negativ werden (z.B. `new TimeSpan(-1, 0)`), obwohl `totalMinutes ≥ 0` gefordert ist.\n- `add` erlaubt negative Werte und kann dadurch eine Zeitspanne verkürzen (`totalMinutes` wird kleiner), obwohl nur Verlängern erlaubt ist (`totalMinutes ≥ old(totalMinutes)`).\n- `getMinutes()` kann außerhalb von `0..59` liegen, weil in `add` keine Umrechnung von “überzähligen Minuten” in Stunden passiert (z.B. 1h 50min + 0h 30min ergibt bei dir 1h 80min statt 2h 20min).\n\n### Suggestion\n- Überlege im Konstruktor, welche Eingaben du akzeptieren willst, damit die resultierenden Gesamtminuten nie negativ werden; wenn die Bedingung verletzt ist, wirf eine `IllegalArgumentException`.\n- Leite für `add` eine Precondition her, die garantiert, dass sich die Gesamtminuten nicht verringern (du kannst dazu über “Delta in Minuten” nachdenken) und wirf sonst ebenfalls `IllegalArgumentException`.\n- Baue nach dem Addieren eine Normalisierung ein, sodass Minuten immer in den Bereich `0..59` fallen (Stichwort: “Minutenüberschuss in Stunden umwandeln” und Rest behalten).\n\n### Code Style\n- Es fehlt `@Override` bei `toString()` (und eine `toString()`-Methode insgesamt); ist nicht explizit verlangt, aber für Debugging und Lesbarkeit sehr hilfreich.\n- Um doppelte Logik zu vermeiden, könntest du (wenn du Checks/Normalisierung ergänzt) Konstruktor und `add` so strukturieren, dass gemeinsame Validierung/Normalisierung nur an einer Stelle steht.\n\n\n# Exercise: asteroids\n\n### Correctness\n- Teil (a) ist nicht umgesetzt: Der Falcon kann weiterhin beliebig weit aus dem Spielfeld fliegen; es fehlen Spielfeldgrenzen als Attribute sowie eine Invariante, die `x/y` einschränkt.\n- Teil (b) ist nicht umgesetzt: Es gibt keine Klasse `Asteroid` mit `x/y`, `vx/vy`, `typ` (0–2), `größe` (0.1–1.0), Konstruktor sowie `move`- und `draw`-Methode, und in `AsteroidsGame` wird kein Asteroid zum Testen bewegt/gezeichnet.\n- Teil (c) ist nicht umgesetzt: Es werden nicht fortlaufend neue Asteroiden generiert, es gibt kein Array/keine Sammlung für mehrere Asteroiden, und es werden keine Asteroiden entfernt, wenn sie unten aus dem Spielfeld fliegen.\n- Teil (d) ist nicht umgesetzt: Es gibt keine Kollisionserkennung zwischen Falcon und Asteroiden und keinen Game-Over-Zustand mit entsprechendem Bild.\n\n### Suggestion\n- Überlege dir, welche minimalen/maximalen `x/y`-Werte für den Falcon gelten sollen (inkl. “Radius”/halbe Bildgröße) und wie du diese Grenzen als Attribute im `Falcon` speichern kannst, sodass `move()` die Invariante danach wieder erfüllt.\n- Erstelle `Asteroid` analog zum `Falcon`, aber mit konstant bleibender Geschwindigkeit: Achte darauf, dass `move()` nur Positionen verändert und nicht wie beim Falcon die Geschwindigkeit durch Eingaben beeinflusst wird; `draw()` sollte je nach `typ` ein anderes Bild verwenden und mit der `größe` skalieren.\n- Für das periodische Spawnen: Plane eine Datenstruktur (z. B. Array mit `null`-Plätzen) und eine Stelle im Game-Loop, wo du mit `Random` gelegentlich einen freien Slot suchst und einen neuen Asteroiden einfügst; fürs Entfernen prüfst du pro Asteroid, ob seine `y`-Position unterhalb der unteren Grenze liegt.\n- Für Kollisionen: Implementiere eine Methode, die Distanz zwischen zwei Zentren berechnet (Δx, Δy, sqrt) und mit der Summe der Radien vergleicht; im Loop musst du dann “irgendein Asteroid kollidiert” erkennen und die Schleife beenden, bevor du den Game-Over-Screen zeichnest.\n\n### Code Style\n- In `AsteroidsGame` fehlt ein `public static void main(String[] args)`-Einstiegspunkt; `void main()` wird von Java nicht als Programmstart verwendet (auch wenn das nicht direkt Teil der Aufgaben ist, hilft es beim Ausführen).\n- Die bisherigen Klassen sind 1:1 wie die Ausgangsversion; wenn du die nächsten Teile implementierst, achte darauf, Zuständigkeiten sauber zu trennen (Asteroid zeichnet/bewegt sich selbst, Game verwaltet nur die Liste/Spawns/Checks).\n\n\n# Exercise: bosses\n\n### Correctness\n- `isSuperiorOf(Employee other)` ist nicht implementiert und liefert immer `false`; damit sind z.B. `sara.isSuperiorOf(sara)` (muss `true` sein) und Fälle wie `ceo.isSuperiorOf(sara)` nicht erfüllbar.\n- `findCommonSuperiorWith(Employee other)` ist nicht implementiert und liefert immer `null`; damit werden alle geforderten Beispiele (z.B. gemeinsamer Vorgesetzter im selben Unternehmen) verletzt.\n\n### Suggestion\n- Für `isSuperiorOf`: Starte bei `other` und laufe über `getBoss()` die Kette nach oben; prüfe bei jedem Schritt, ob du `this` erreichst. Denk daran, dass „eine Person ist Vorgesetzte von sich selbst“ bedeutet, dass der erste Vergleich schon `other == this` sein kann.\n- Für `findCommonSuperiorWith`: Überlege dir eine Suche, die die Vorgesetztenkette der einen Person mit der Vorgesetztenkette der anderen abgleicht, bis du den „ersten“ gemeinsamen findest. Eine Möglichkeit ist, für jede Kandidatin in der `this`-Kette zu prüfen, ob sie Vorgesetzte von `other` ist (da du dafür `isSuperiorOf` wiederverwenden kannst).\n- Achte bei beiden Methoden darauf, dass die Suche endet, wenn du in der Kette bei `null` ankommst (CEO bzw. Ende der Firma), und dass dann korrekt `false` bzw. `null` zurückkommt.\n\n### Code Style\n- Die `// TODO`-Kommentare in den beiden Methoden sind nach der Implementierung überflüssig und sollten entfernt werden.\n\n\n# Exercise: smarthome\n\n### Correctness\n- `turnNextRoomBright` hellt bei dir alle Räume/Lampen auf (setzt überall `on` und `brightness`), statt nur den *ersten* Raum zu finden, der noch nicht komplett “an und 1.0” ist, und nur diesen einen Raum zu ändern.\n- `turnNextRoomBright` berücksichtigt den Fall “Sind bereits in allen Räumen alle Lampen eingeschaltet und auf voller Helligkeit, passiert nichts” nicht, weil du immer etwas veränderst (bzw. zumindest alles durchläufst und potenziell einschaltest/aufhellst).\n\n### Suggestion\n- Überlege dir für `turnNextRoomBright` zuerst eine Prüfung pro Raum: Wann ist ein Raum “bereits ok” (alle Lampen an *und* Helligkeit 1.0)? Erst wenn du einen Raum findest, der diese Bedingung nicht erfüllt, sollst du genau diesen Raum komplett setzen.\n- Du brauchst irgendeine Art “Merker”, dass der passende Raum schon gefunden/aufgehellt wurde, damit danach keine weiteren Räume mehr verändert werden (ohne `break`/early return: z.B. über ein Flag und passende Bedingungen in den Schleifen).\n\n### Code Style\n- In `randomize` erstellst du innerhalb der Schleifen mehrfach `new Random()`. Das ist unnötig und macht den Code schwerer nachvollziehbar; erstelle den Zufallsgenerator einmal und nutze ihn wieder.\n- In `saveEnergy` verwendest du `Integer.MAX_VALUE` für eine `double`-Variable; nimm dafür lieber einen zum Datentyp passenden Startwert (lesbarer).\n- In `findBedrooms` nutzt du den gleichen Index im Ergebnisarray wie im `rooms`-Array; erlaubt, aber unübersichtlich, weil “Lücken” entstehen. Ein separater Schreibindex macht die Absicht klarer.\n- Mehrfach wiederholter Code zum “alle Lampen ausschalten” (z.B. in `nightMode`) wäre ein guter Kandidat für eine kleine Hilfsmethode, wie in der Aufgabenstellung angedeutet.\n",
"status" : "SUCCESS"
}
}