#!/usr/bin/env python3 import tools.aoc as aoc 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(aoc.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(silent=True): print("TEST FAILED! Aborting.") sys.exit(1) if not flags.part or flags.part == 2: if not day_class.test_part2(silent=True): 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: aoc.printSolution(day, 1, day_class.part1()) else: exec_time = timeit.timeit( 'day_class.part1()', globals=globals(), number=flags.timeit_number ) / flags.timeit_number aoc.printSolution(day, 1, day_class.part1(), exec_time=exec_time) if not flags.part or flags.part == 2: if not flags.timeit: if flags.test: day_class.test_part2() else: aoc.printSolution(day, 2, day_class.part2()) else: exec_time = timeit.timeit( 'day_class.part2()', globals=globals(), number=flags.timeit_number ) / flags.timeit_number aoc.printSolution(day, 2, day_class.part2(), exec_time=exec_time)