summaryrefslogtreecommitdiffstats
path: root/20/py/aoc20.py
blob: 5a90a919eebc1797434bd8c6bfb470cdf1e66671 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/env python3
import sys
import time


def read_input(args, day):
    if len(args) > 0:
        if args[0] == "-":
            return sys.stdin.readlines()
        else:
            return open(args[0]).readlines()
    else:
        return open(f"../input/{day:02}", "r").readlines()


if __name__ == "__main__":
    import d01
    import d02
    import d03
    import d04
    import d05
    import d06
    import d07
    import d08
    import d09

    skip = set()
    only = set()
    only_part = 0
    run_times = 1
    input_root = "../input"

    argv, argc = sys.argv, len(sys.argv)
    i = 1
    while i < argc:
        if argv[i] == "--help":
            print(f"usage: {argv[0]} [--help] [--time [times]] [--skip <n> <n> ...]\n" +
                   "       [--only <n> <n> ...] [--part 0|1|2] [--input <dir>]")
            sys.exit(0)
        elif argv[i] == "--time":
            i += 1
            if i < argc and not argv[i].startswith("-"):
                run_times = int(argv[i])
                i += 1
            else:
                run_times = 10
        elif argv[i] == "--skip":
            i += 1
            while i < argc and not argv[i].startswith("-"):
                skip.add(int(argv[i]))
                i += 1
        elif argv[i] == "--only":
            i += 1
            while i < argc and not argv[i].startswith("-"):
                only.add(int(argv[i]))
                i += 1
        elif argv[i] == "--part":
            i += 1
            only_part = int(argv[i])
            i += 1
        elif argv[i] == "--input":
            i += 1
            input_root = argv[i]
            i += 1
        else:
            print(f"unknown argument {argv[i]}")
            print(f"maybe try {argv[0]} --help ?")
            i += 1

    print("day  part | time   | tot_time | ans")
    print("----------+--------+----------+-----------")

    tot_time, tot_time_part = 0, [0, 0]
    runs = 0
    for day, mod in enumerate((d01, d02, d03, d04, d05,
                               d06, d07, d08, d09)):
        if day+1 in skip or (only and day+1 not in only):
            continue
        input = open(f"{input_root}/{day+1:02}").readlines()
        for part, part_func in enumerate((mod.pt1, mod.pt2)):
            if only_part != 0 and part+1 != only_part:
                continue
            times = []
            for i in range(run_times):
                start = time.time()
                ans = part_func(input)
                ans_time = time.time()
                times.append(ans_time-start)
            avg_time = sum(times) / len(times)
            tot_time += avg_time
            tot_time_part[part] += avg_time
            print(f" {day+1:2}     {part+1} | {avg_time*1000:6.3f} | {tot_time*1000:6.3f}   | {ans}")
        runs += 1
    print("----------+--------+----------+-----------")
    if only_part in (0, 1):
        print(f"average 1 | {tot_time_part[0]*1000/runs:6.3f} |")
    if only_part in (0, 2):
        print(f"average 2 | {tot_time_part[1]*1000/runs:6.3f} |")