from typing import Callable, List EXAMPLE = """ 47|53 97|13 97|61 97|47 75|29 61|13 75|53 29|13 97|29 53|29 61|53 97|53 61|29 47|13 75|47 97|75 47|61 75|61 47|29 75|13 53|13 75,47,61,53,29 97,61,53,29,13 75,29,13 75,97,47,61,53 61,13,29 97,13,75,29,47 """ class CheckManual: def __init__(self, input: str) -> None: self._input = input[1:] sep = self._input.splitlines().index("") self.rules = self.parse_rules(self._input.splitlines()[:sep]) self.pages = self._input.splitlines()[sep:] def __str__(self) -> str: return f"Part1: {self._part1}\nPart2: {self._part2}" @property def _part1(self) -> int: return None @property def _part2(self) -> int: return None def parse_rules( self, rules: List[str], sep: str = "|" ) -> List[Callable[[str], bool]]: def make_rule(rule: str, sep: str = "|") -> Callable[[str], bool]: left, right = rule.split(sep) def check(pages: str) -> bool: _pages = pages.split(",") try: _pages.index(left) < _pages.index(right) except ValueError: return True return check return [make_rule(rule) for rule in rules] def check_page_order(self) -> List[bool]: return [all([check(line) for check in self.rules]) for line in self.pages] if __name__ == "__main__": example = CheckManual(EXAMPLE) print(example)