-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
159 lines (139 loc) · 4.8 KB
/
main.py
File metadata and controls
159 lines (139 loc) · 4.8 KB
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
"""Advent of Code CLI Runner.
This module provides a command-line interface for running and managing Advent of Code
solutions. It handles running solutions, creating template files, downloading inputs,
running tests, benchmarking performance, and submitting answers to https://adventofcode.com.
The CLI supports various arguments to control execution. Users can specify which year, day
and part to run, customise how inputs are handled, create necessary solution files,
control test execution and performance benchmarking, and submit answers directly to
the Advent of Code website.
"""
from argparse import ArgumentParser
import datetime
from loguru import logger
from aoc.models.file import File
from aoc.models.submission import Submission
from aoc.utils.initalise import initialise
def main() -> None:
"""Execute the Advent of Code CLI workflow.
Parses command-line arguments and performs the requested operation:
1. Validates day number is 1-25
2. If creation flags used:
- Creates solution files, test files, or downloads inputs
3. If solving puzzle:
- Validates part number is 1 or 2
- Runs tests unless skipped
- Executes solution and displays answer
- Submits answer if requested
Exit codes:
0: Success
1: Invalid day/part number (implicit through exit())
"""
_year = datetime.date.today().year
_today = datetime.date.today().day
parser = ArgumentParser(description="Advent of Code solution runner")
parser.add_argument(
"-y",
"--year",
dest="year",
default=_year,
metavar="year_number",
type=int,
help="Required, year of the AoC event.",
)
parser.add_argument(
"-d",
"--day",
dest="day",
default=_today,
metavar="day_number",
type=int,
help="Required, day number of the AoC event. Must be between 1 and 25.",
)
parser.add_argument(
"-p",
"--part",
dest="part",
default=1,
metavar="part_number",
type=int,
help="Required, part number of the day of the AoC event. Possible values are 1 or 2.",
)
parser.add_argument(
"--raw",
action="store_true",
help="Optional, use raw input instead of stripped input.",
)
parser.add_argument("--add", action="store_true", help="Optional, create daily file.")
parser.add_argument(
"--add-test-input",
action="store_true",
help="Optional, download additional test input files.",
)
parser.add_argument(
"--add-test-file",
action="store_true",
help="Optional, create test files.",
)
parser.add_argument("--skip-test", action="store_true", help="Optional, skipping tests.")
parser.add_argument(
"--benchmark",
action="store_true",
help="Optional, benchmarking the code, and also skipping tests.",
)
parser.add_argument(
"--submit",
action="store_true",
help="Optional, submit your answer to Advent of Code.",
)
args = parser.parse_args()
if not 0 < args.day < 26:
logger.info("Day number must be between 1 and 25")
exit()
elif args.add:
logger.info(f"Adding day {args.day}")
File.add_day(args.year, args.day)
elif args.add_test_input:
logger.info(f"Adding test input file for day {args.day}")
File.add_test_input(args.year, args.day, args.part)
elif args.add_test_file:
logger.info(f"Adding test file for day {args.day}")
File.add_test_file(args.year, args.day)
elif args.part not in [1, 2]:
logger.info("Part number must be 1 or 2")
exit()
elif not args.skip_test:
logger.info(f"Testing day {args.day} part {args.part}\n")
solution = initialise(
args.year,
args.day,
args.part,
raw=args.raw,
skip_test=args.skip_test,
benchmark=args.benchmark,
)
logger.info(
f"The test answer is {answer}\n"
if (answer := solution.solve(part_num=args.part)) is not None
else ""
)
solution.benchmark(_print=True)
else:
logger.info(f"Solving day {args.day} part {args.part}\n")
solution = initialise(
args.year,
args.day,
args.part,
raw=args.raw,
skip_test=args.skip_test,
benchmark=args.benchmark,
)
logger.info(
f"The answer is {answer}\n"
if (answer := solution.solve(part_num=args.part)) is not None
else ""
)
solution.benchmark(_print=True)
if answer and args.submit is True:
Submission.submit(args.year, args.day, args.part, answer)
if __name__ == "__main__":
main()