summaryrefslogtreecommitdiffstats
path: root/day5/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'day5/__init__.py')
-rw-r--r--day5/__init__.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/day5/__init__.py b/day5/__init__.py
new file mode 100644
index 0000000..4d5260d
--- /dev/null
+++ b/day5/__init__.py
@@ -0,0 +1,74 @@
1from collections import Counter
2from copy import copy
3from dataclasses import dataclass
4from typing import Iterator, List, Optional, Tuple, Callable
5
6from aoc import BaseAssignment
7
8Vector = Tuple[Tuple[int, int], Tuple[int, int]]
9
10class Assignment(BaseAssignment):
11 def parse_item(self, item: str) -> Vector:
12 start, end = item.split('->')
13 return (
14 tuple(int(_) for _ in start.strip().split(',')),
15 tuple(int(_) for _ in end.strip().split(',')),
16 )
17
18 def read_input(self, example = False) -> List[Vector]:
19 return list(super().read_input(example))
20
21
22def is_horizontal(v: Vector):
23 return v[0][0] == v[1][0]
24
25def is_vertical(v: Vector):
26 return v[0][1] == v[1][1]
27
28def points_in_vector(vector: Vector) -> List[Tuple[int, int]]:
29 first_x = min(vector[0][0], vector[1][0])
30 last_x = max(vector[0][0], vector[1][0])
31 first_y = min(vector[0][1], vector[1][1])
32 last_y = max(vector[0][1], vector[1][1])
33
34 return [
35 (vector[0][0], y)
36 for y
37 in range(first_y, last_y + 1)
38 ] if is_horizontal(vector) else [
39 (x, vector[0][1])
40 for x
41 in range(first_x, last_x + 1)
42 ] if is_vertical(vector) else []
43
44
45class AssignmentOne(Assignment):
46 example_result = 5
47
48 def run(self, input: List[Vector]) -> int:
49 coordinates = []
50
51 for vector in input:
52 coordinates += points_in_vector(vector)
53
54 return len([c for c in Counter(coordinates).values() if c >= 2])
55
56
57
58
59# class AssignmentTwo(Assignment):
60# example_result = 1924
61#
62# def run(self, input: Tuple[List[int], List[BingoCard]]) -> int:
63# nrs, cards = input
64#
65# in_game = copy(cards)
66# for nr in nrs:
67# for card in copy(in_game):
68# card.mark(nr)
69#
70# if card.bingo:
71# in_game.remove(card)
72#
73# if len(in_game) == 0:
74# return nr * sum(card.unmarked) \ No newline at end of file