3.8 KiB
Alicia — Harter Test
Ziel: Prüfen, ob Alicia echte BSN-Entwicklungsarbeit leisten kann. Zeit: 30-60 Minuten für einen Agenten. Abgabe: 3 Dateien + Tests. Ruff ✅ + mypy ✅ + pytest ✅.
AUFGABE: Spiele-Empfehlungs-Engine
Baue eine Empfehlungs-Engine, die Brettspiele basierend auf Nutzerpräferenzen bewertet
und ranked. Nutze dein bereits existierendes game_rating.py-Modul.
Datei 1: game_database.py — Spiele-Datenbank
Erstelle ein Modul, das eine Spiele-Datenbank verwaltet.
# Datentyp
SPIEL = dict[str, str | int | float | list[str]]
# {"name": "Catan", "min_spieler": 3, "max_spieler": 4,
# "dauer_min": 60, "komplexitaet": 2.5, "kategorien": ["Strategie", "Handel"]}
Funktionen:
-
spiele_laden() -> list[SPIEL]- Lädt Spiele aus einer eingebetteten Liste (mindestens 8 Spiele)
- Verschiedene Spielertypen abdecken: Familienspiele, Kennerspiele, Partyspiele
-
spiele_filtern(spiele: list[SPIEL], spieler_count: int | None = None, kategorien: list[str] | None = None, max_dauer: int | None = None) -> list[SPIEL]- Filtert nach Spieleranzahl, Kategorien und maximaler Dauer
- Geladene Filter werden ignoriert (None = kein Filter)
Datei 2: empfehlung_service.py — Empfehlungs-Algorithmus
Erstelle einen Service, der Empfehlungen berechnet.
Funktionen:
-
score_berechnen(spiel: SPIEL, praeferenzen: dict[str, float]) -> float- Berechnet Match-Score basierend auf Präferenzen
- Präferenzen:
{"komplexitaet": 3.0, "dauer": 45, "interaktion": 8} - Höherer Score = bessere Übereinstimmung
- Formel (selbst entwerfen):
- Komplexität: je näher an Wunsch, desto besser
- Dauer: je kürzer als Wunsch, desto besser (kein Spiel zu lang)
- Spezielle Wertung für exakte Übereinstimmungen
-
empfehlungen_erstellen(spiele: list[SPIEL], praeferenzen: dict[str, float], limit: int = 5) -> list[tuple[str, float]]- Berechnet Scores für alle Spiele
- Sortiert absteigend
- Gibt Top-N zurück als
[(name, score), ...] - Delegiert an
score_berechnen()
Datei 3: test_empfehlung.py — Tests
Mindestens 8 Tests, die abdecken:
| # | Test | Was |
|---|---|---|
| 1 | Filter nach Spieleranzahl | Nur passende Spiele |
| 2 | Filter nach Kategorie | Nur Spiele mit Kategorie |
| 3 | Filter nach Maximaldauer | Kein Spiel zu lang |
| 4 | Mehrere Filter kombiniert | Alle Bedingungen erfüllt |
| 5 | Score bei exakter Übereinstimmung | Höchster Score |
| 6 | Score bei weit entfernten Werten | Niedrigster Score |
| 7 | Empfehlungen sortiert | Höchster Score zuerst |
| 8 | Empfehlungen mit Limit | Nur N Ergebnisse |
🔴 WAS GEPRÜFT WIRD
| Regel | Wo |
|---|---|
| Typ-Annotationen an JEDER Funktion | Alle 3 Dateien |
X | None (nicht Optional) |
int | None, list[str] | None |
| Deutsche Google-Style Docstrings | Alle öffentlichen Funktionen |
UPPER_SNAKE_CASE |
Konstanten |
snake_case |
Funktionen, Variablen |
| Keine Secrets | Keine Keys, keine Passwörter |
| Separation of Concerns | game_database ≠ empfehlung_service |
| Keine God-Functions (>50 Zeilen) | Funktionen kurz halten |
| Test-Namen aussagekräftig | test_<was>_<erwartung> |
✅ ERFOLGSKRITERIEN
ruff check game_database.py empfehlung_service.py test_empfehlung.py # ✅
mypy game_database.py empfehlung_service.py test_empfehlung.py # ✅
pytest test_empfehlung.py -v # ✅ 8+ passed
📦 COMMIT
git add game_database.py empfehlung_service.py test_empfehlung.py
git commit -m "feat: Spiele-Empfehlungs-Engine mit Scoring-Algorithmus"
git push origin main
Hinweis: Dein
game_rating.pyist bereits im Repo. Du kannst es importieren, musst es aber nicht — es geht um neue Dateien. Redis ist verfügbar (localhost:6379), Nutzung optional (Bonus).