summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--aoc/__init__.py3
-rw-r--r--aoc/__main__.py2
-rw-r--r--day1/__init__.py3
-rw-r--r--day2/__init__.py3
-rw-r--r--day3/__init__.py39
-rw-r--r--day3/example.txt4
-rw-r--r--day3/test_init.py22
7 files changed, 72 insertions, 4 deletions
diff --git a/aoc/__init__.py b/aoc/__init__.py
index 0257b69..f490bf8 100644
--- a/aoc/__init__.py
+++ b/aoc/__init__.py
@@ -17,7 +17,8 @@ class BaseAssignment(Generic[T, I], ABC):
17 def __str__(self): 17 def __str__(self):
18 return f"{self.__module__}.{self.__class__.__name__}" 18 return f"{self.__module__}.{self.__class__.__name__}"
19 19
20 def parse_item(self, item: str) -> Iterator[I]: 20 @classmethod
21 def parse_item(cls, item: str) -> Iterator[I]:
21 yield item 22 yield item
22 23
23 @property 24 @property
diff --git a/aoc/__main__.py b/aoc/__main__.py
index 596abee..96a9b7f 100644
--- a/aoc/__main__.py
+++ b/aoc/__main__.py
@@ -38,7 +38,7 @@ def run(
38 38
39 Assignment = getattr(assignment_day, f"Assignment{AssignmentPart(part).name}") 39 Assignment = getattr(assignment_day, f"Assignment{AssignmentPart(part).name}")
40 assignment = Assignment( 40 assignment = Assignment(
41 path=os.path.dirname(assignment_day.__file__), **dict(kwargs) 41 path=os.path.dirname(assignment_day.__file__), **dict(kwargs or {})
42 ) 42 )
43 43
44 start = perf_counter() 44 start = perf_counter()
diff --git a/day1/__init__.py b/day1/__init__.py
index ec1c2f2..03d00ff 100644
--- a/day1/__init__.py
+++ b/day1/__init__.py
@@ -6,7 +6,8 @@ from aoc import BaseAssignment, I
6 6
7 7
8class Assignment(BaseAssignment, ABC): 8class Assignment(BaseAssignment, ABC):
9 def parse_item(self, item: str) -> Iterator[I]: 9 @classmethod
10 def parse_item(cls, item: str) -> Iterator[I]:
10 [rotation, *places] = item 11 [rotation, *places] = item
11 places = int("".join(places)) 12 places = int("".join(places))
12 13
diff --git a/day2/__init__.py b/day2/__init__.py
index 882bcad..20e573e 100644
--- a/day2/__init__.py
+++ b/day2/__init__.py
@@ -7,7 +7,8 @@ from aoc import BaseAssignment, I, T
7 7
8 8
9class Assignment(BaseAssignment, ABC): 9class Assignment(BaseAssignment, ABC):
10 def parse_item(self, item: str) -> Iterator[range]: 10 @classmethod
11 def parse_item(cls, item: str) -> Iterator[range]:
11 for r in item.split(","): 12 for r in item.split(","):
12 [start, end] = r.split("-") 13 [start, end] = r.split("-")
13 yield range(int(start), int(end) + 1) 14 yield range(int(start), int(end) + 1)
diff --git a/day3/__init__.py b/day3/__init__.py
new file mode 100644
index 0000000..9025f4a
--- /dev/null
+++ b/day3/__init__.py
@@ -0,0 +1,39 @@
1# -*- coding: utf-8 -*-
2from abc import ABC
3from typing import Iterator
4
5from aoc import BaseAssignment
6
7
8class Assignment(BaseAssignment, ABC):
9 @classmethod
10 def parse_item(cls, item: str) -> Iterator[list[int]]:
11 yield [int(i) for i in item]
12
13 @classmethod
14 def find_highest_joltage(cls, item: list[int], n: int) -> int:
15 values = list()
16 item_length = len(item)
17
18 last_index = -1
19 for end_index in range(item_length - n + 1, item_length + 1):
20 start_index = last_index + 1
21 value = max(item[start_index:end_index])
22 last_index = item.index(value, start_index, end_index)
23 values.append(str(value))
24
25 return int("".join(values))
26
27
28class AssignmentOne(Assignment):
29 example_result = 357
30
31 def run(self, input: Iterator[list[int]]) -> int:
32 return sum([self.find_highest_joltage(item, 2) for item in input])
33
34
35class AssignmentTwo(Assignment):
36 example_result = 3121910778619
37
38 def run(self, input: Iterator[list[int]]) -> int:
39 return sum([self.find_highest_joltage(item, 12) for item in input])
diff --git a/day3/example.txt b/day3/example.txt
new file mode 100644
index 0000000..7255fca
--- /dev/null
+++ b/day3/example.txt
@@ -0,0 +1,4 @@
1987654321111111
2811111111111119
3234234234234278
4818181911112111
diff --git a/day3/test_init.py b/day3/test_init.py
new file mode 100644
index 0000000..ae4033e
--- /dev/null
+++ b/day3/test_init.py
@@ -0,0 +1,22 @@
1# -*- coding: utf-8 -*-
2import pytest
3
4from day3 import AssignmentOne, AssignmentTwo, Assignment
5
6
7class TestAssignment:
8 data = [
9 ["987654321111111", 2, 98],
10 ["811111111111119", 2, 89],
11 ["234234234234278", 2, 78],
12 ["818181911112111", 2, 92],
13 ["987654321111111", 12, 987654321111],
14 ["811111111111119", 12, 811111111119],
15 ["234234234234278", 12, 434234234278],
16 ["818181911112111", 12, 888911112111],
17 ]
18
19 @pytest.mark.parametrize("battery,n,joltage", data)
20 def test_find_highest_joltage(self, battery: str, n: int, joltage: int):
21 banks = next(Assignment.parse_item(battery))
22 assert Assignment.find_highest_joltage(banks, n) == joltage