82 lines
2.3 KiB
Python
82 lines
2.3 KiB
Python
import sys
|
|
from importlib import import_module
|
|
|
|
from advent.common import input
|
|
from advent.days.template import Day, ResultType, is_day
|
|
|
|
|
|
def output(day: int, part: int, result: ResultType | None) -> None:
|
|
match result:
|
|
case int(value):
|
|
print('Day {0:02} Part {1}: {2}'.format(day, part, value))
|
|
case str(value):
|
|
print('Day {0:02} Part {1}: {2}'.format(day, part, value))
|
|
case list(value):
|
|
print('Day {0:02} Part {1}: {2}'.format(day, part, value[0]))
|
|
for line in value[1:]:
|
|
print(f' {line}')
|
|
case None:
|
|
print('Day {0:02} Part {1}: (No Result)'.format(day, part))
|
|
case _:
|
|
print('Day {0:02} Part {1}: (Unknown result type)'.format(day, part))
|
|
|
|
|
|
def get_day(day_num: int) -> Day:
|
|
day_module = import_module('advent.days.day{0:02}.solution'.format(day_num))
|
|
if not is_day(day_module):
|
|
raise Exception(f'Not a valid day: {day_num}')
|
|
|
|
return day_module
|
|
|
|
|
|
def run(day: Day, part: int) -> None:
|
|
data = input.read_lines(day.day_num, 'input.txt')
|
|
match part:
|
|
case 1: output(day.day_num, 1, day.part1(data))
|
|
case 2: output(day.day_num, 2, day.part2(data))
|
|
case _: raise Exception(f'Unknown part {part}')
|
|
|
|
|
|
def run_from_string(day_str: str) -> None:
|
|
match day_str.split('/'):
|
|
case [d]:
|
|
day_num = int(d)
|
|
day = get_day(day_num)
|
|
|
|
if day_num == day.day_num:
|
|
run(day, 1)
|
|
run(day, 2)
|
|
|
|
case [d, p]:
|
|
day_num = int(d)
|
|
day = get_day(day_num)
|
|
|
|
if day_num == day.day_num:
|
|
part = int(p)
|
|
run(day, part)
|
|
|
|
case _:
|
|
raise Exception(f'{day_str} is not a valid day description')
|
|
|
|
|
|
def main() -> None:
|
|
match sys.argv:
|
|
case [_]:
|
|
try:
|
|
for day_num in range(1, 25):
|
|
day = get_day(day_num)
|
|
if day_num == day.day_num:
|
|
run(day, 1)
|
|
run(day, 2)
|
|
except ModuleNotFoundError:
|
|
pass
|
|
|
|
case [_, argument]:
|
|
run_from_string(argument)
|
|
|
|
case _:
|
|
raise Exception(f'Usage: python {sys.argv[0]} [day[/part]]')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|