-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaoc_base.py
49 lines (36 loc) · 1.17 KB
/
aoc_base.py
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
import argparse
import os
import time
from typing import Generator, Tuple, Union
from contextlib import contextmanager
@contextmanager
def timer() -> Generator[None, None, None]:
start = time.perf_counter()
yield
end = time.perf_counter()
runtime = end - start
unit = "s"
if runtime < 10:
runtime *= 1000
unit = "ms"
if runtime < 10:
runtime *= 1000
unit = "μs"
print(f"Time: {runtime} {unit}")
class BaseSolution:
_path = __package__
def solve(self, s: str) -> int:
raise NotImplementedError
def main(self) -> int:
with open(os.path.join(self._path, "input.txt")) as f, timer():
print(self.solve(f.read().strip()))
return 0
class BaseTest:
_SAMPLES: Union[Tuple[()], Tuple[Tuple[str, int], ...]] = ()
def solve(self, s: str) -> int:
raise NotImplementedError
def pytest_generate_tests(self, metafunc: argparse.Namespace) -> None:
metafunc.parametrize("s, expected", self._SAMPLES)
def test_solve(self, s: str, expected: int) -> None:
output = self.solve(s)
assert output == expected, f"Expected {expected}, got {output}"