aoc2021/main.py
2021-11-21 13:04:32 +01:00

80 lines
2.5 KiB
Python

#!/usr/bin/env python3
import aoclib
import argparse
import importlib
import os
import sys
import timeit
TIMEIT_NUMBER = 50
argument_parser = argparse.ArgumentParser()
argument_parser.add_argument("-d", "--day", help="specify day to process; leave empty for ALL days", type=int)
argument_parser.add_argument("-t", "--test", help="run test cases", action="store_true", default=False)
argument_parser.add_argument("-p", "--part", help="run only part x", choices=[1, 2], type=int)
argument_parser.add_argument("--timeit", help="measure execution time", action="store_true", default=False)
argument_parser.add_argument(
"--timeit-number",
help="build average time over this many executions",
type=int,
default=TIMEIT_NUMBER
)
flags = argument_parser.parse_args()
import_day = ""
if flags.day:
import_day = "%02d" % flags.day
imported = []
for _, _, files in os.walk(aoclib.BASE_PATH):
for f in files:
if f.startswith('day' + import_day) and f.endswith('.py'):
lib_name = f[:-3]
globals()[lib_name] = importlib.import_module(lib_name)
imported.append(lib_name)
break
for lib in sorted(imported):
day = int(lib[-2:])
day_class = getattr(globals()[lib], "Day")(day)
if not flags.test:
if not flags.part or flags.part == 1:
if not day_class.test_part1():
print("TEST FAILED! Aborting.")
sys.exit(1)
if not flags.part or flags.part == 2:
if not day_class.test_part2():
print("TEST FAILED! Aborting.")
sys.exit(1)
if not flags.part or flags.part == 1:
if not flags.timeit:
if flags.test:
day_class.test_part1()
else:
aoclib.printSolution(day, 1, day_class.part1())
else:
exec_time = timeit.timeit(
'day_class.part1()',
globals=globals(),
number=flags.timeit_number
) / flags.timeit_number
aoclib.print_execution_time(day, 1, exec_time)
if not flags.part or flags.part == 2:
if not flags.timeit:
if flags.test:
day_class.test_part2()
else:
aoclib.printSolution(day, 2, day_class.part2())
else:
exec_time = timeit.timeit(
'day_class.part2()',
globals=globals(),
number=flags.timeit_number
) / flags.timeit_number
aoclib.print_execution_time(day, 2, exec_time)