Quellcode für gropro.puzzle

"""Das puzzle Modul beinhaltet die Repräsentation eines voll definierten Problems sowie die erzeugende Methode um Problem Definitionen zu interpretieren und auf Vollständigkeit zu prüfen"""

from dataclasses import dataclass, field
from gropro.teil import Teil
from gropro.ebene import Ebene
from gropro.element import Element
from gropro.gio.reader import IReader
from gropro.exceptions import ParseError


[Doku] @dataclass class Puzzle: teile: list[Teil] dimension: tuple[int, int, int] header: list[str] ebenen: list[Ebene] = field(default_factory=list) def __str__(self): return "".join(self.to_repr_list())
[Doku] def to_repr_list(self): """Schreibe die Repräsentation gemäß der Aufgabenstellung""" repr: list[str] = [] repr.extend([line.rstrip("\n") for line in self.header]) repr.append(f"Dimension {','.join([str(dz) for dz in self.dimension])}") repr.append("Anordnung der Teile") for i, e in enumerate(self.ebenen): repr.append(f"Ebene {len(self.ebenen) - i}") repr.append(str(e)) if i + 1 < len(self.ebenen): repr.append("") return repr
[Doku] def load_puzzle(input: IReader) -> Puzzle: """ - Nimm die Eingabedaten entgegen - Validiere die Eingabedaten - Erzeuge Repräsentative Datenmodelle - Sammle alle korrekt definierten Daten in einer Puzzle Instanz """ content = input.read() header, _dimension, body = content[:3], content[3], content[4:] teile: list[Teil] = [] try: dimension = tuple( int(dz) for dz in _dimension.split("Dimension ")[1].strip().split(",") ) assert len(dimension) == 3 except (IndexError, AssertionError): raise ParseError( f"Failed parsing dimension, expected 'Dimension %d,%d,%d' but got '{_dimension}'" ) teilesoll = dimension[1] * dimension[2] for i, line in enumerate(body): name, _elements = [el for el in line.split(" ") if el] elements = [Element(int(el)) for el in _elements.split(",")] if len(elements) != dimension[0]: raise ParseError( f"Failed parsing Teil on line {i+5}, expected 'A {','.join(['%d' for _ in range(dimension[0])])}' but got '{line}'" ) teile.append(Teil(name, elements)) try: assert len(teile) == teilesoll except AssertionError: raise ParseError( f"Failed parsing Teileliste, expected {teilesoll} but got {len(teile)} Teile" ) return Puzzle(header=header, dimension=dimension, teile=teile)