# -*- coding: utf-8 -*- import os from abc import ABC from typing import Generator, Any, Iterator, Dict, TypeVar, Generic T = TypeVar("T") I = TypeVar("I") class BaseAssignment(Generic[T, I], ABC): example_result: T = NotImplemented example_kwargs: Dict = {} def __init__(self, path): self.path = path def __str__(self): return f"{self.__module__}.{self.__class__.__name__}" def parse_item(self, item: str) -> I: return item @property def part(self) -> int: return 1 if self.__class__.__name__.endswith("One") else 2 def read_input(self, example=False) -> Iterator[I]: file = f"{self.path}/input.txt" if example or not os.path.isfile(file): for file in [ f"{self.path}/example_part_{self.part}.txt", f"{self.path}/example.txt", ]: if os.path.exists(file): break with open(file, "r") as input_file: for line in input_file.readlines(): yield self.parse_item(line.strip("\n")) def run(self, input: Iterator[I]) -> T: raise NotImplementedError("Please implement run")