import itertools import random from typing import Any, Self, Sequence, TypeVar from .config import get_config T = TypeVar("T") class Random(random.Random): @classmethod async def get(cls, bonus_salt: Any = "") -> Self: cfg = await get_config() return cls(f"{cfg.puzzle.solution}{cfg.puzzle.random_seed}{bonus_salt}") def shuffled(self, population: Sequence[T]) -> Sequence[T]: return self.sample(population, k=len(population)) async def shuffle(seq: Sequence, rnd: random.Random | None = None) -> list: # Zufallsgenerator rnd = rnd or await Random.get() # Elemente mischen return rnd.sample(seq, len(seq)) def set_len(seq: Sequence, length: int) -> list: # `seq` unendlich wiederholen infinite = itertools.cycle(seq) # Die ersten `length` einträge nehmen return list(itertools.islice(infinite, length))