From a3de698aa6b7e15e9d0974d32dc566676383bd28 Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Mon, 28 Nov 2022 13:52:27 +0100 Subject: Initial code --- aoc/__init__.py | 27 +++++++++++++++++++++++++++ aoc/__main__.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ aoc/test_init.py | 2 ++ aoc/utils.py | 5 +++++ 4 files changed, 81 insertions(+) create mode 100644 aoc/__init__.py create mode 100644 aoc/__main__.py create mode 100644 aoc/test_init.py create mode 100644 aoc/utils.py (limited to 'aoc') diff --git a/aoc/__init__.py b/aoc/__init__.py new file mode 100644 index 0000000..b13489c --- /dev/null +++ b/aoc/__init__.py @@ -0,0 +1,27 @@ +import os +from abc import ABC +from typing import Generator, Any, Iterator + + +class BaseAssignment(ABC): + example_result = NotImplemented + def __init__(self, path): + self.path = path + + def __str__(self): + return f'{self.__module__}.{self.__class__.__name__}' + + def parse_item(self, item: str) -> Any: + return item + + def read_input(self, example = False) -> Generator: + file = f'{self.path}/input.txt' + if example or not os.path.isfile(file): + file = f'{self.path}/example.txt' + + with open(file, 'r') as input_file: + for line in input_file.readlines(): + yield self.parse_item(line.strip()) + + def run(self, input: Iterator) -> Any: + raise NotImplementedError('Please implement run') \ No newline at end of file diff --git a/aoc/__main__.py b/aoc/__main__.py new file mode 100644 index 0000000..25a7026 --- /dev/null +++ b/aoc/__main__.py @@ -0,0 +1,47 @@ +import argparse +import importlib +import os +from time import perf_counter +from typing import List + + +def day(assignment_part: str) -> str: + return { + '1': 'One', + '2': 'Two', + }[assignment_part] + +def kwargs(kwarg: str) -> List: + return kwarg.split('=') + +parser = argparse.ArgumentParser(description='Advent of Code') + +parser.add_argument('day', type=str, help='Assignment day') +parser.add_argument( + '-p', '--part', type=day, nargs='?', default='1', + help='Assingment part. Defaults to one.' +) +parser.add_argument('--example', default=False, action='store_true') +parser.add_argument('kwargs', type=kwargs, nargs='*') + + +if __name__ == '__main__': + args = parser.parse_args() + assignment_day = importlib.import_module(args.day) + + Assignment = getattr(assignment_day, f'Assignment{args.part}') + assignment = Assignment( + path=os.path.dirname(assignment_day.__file__), + **dict(args.kwargs) + ) + + start = perf_counter() + print( + assignment.run( + input=assignment.read_input(example=args.example), + ) + ) + end = perf_counter() + delta = end - start + print() + print(f'{(delta if delta > 1 else delta * 1000):.3f}{"s" if delta > 1 else "ms"}') diff --git a/aoc/test_init.py b/aoc/test_init.py new file mode 100644 index 0000000..8524086 --- /dev/null +++ b/aoc/test_init.py @@ -0,0 +1,2 @@ +def test_assingment_examples(assignment): + assert assignment.run(input=assignment.read_input(example=True)) == assignment.example_result diff --git a/aoc/utils.py b/aoc/utils.py new file mode 100644 index 0000000..6d794f4 --- /dev/null +++ b/aoc/utils.py @@ -0,0 +1,5 @@ +from typing import Callable + + +def bold(item: str, condition: Callable[[], bool]): + return f'\033[36m{item}\033[0m' if condition() else item -- cgit v1.2.3