-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtask_02.py
81 lines (62 loc) · 2.37 KB
/
task_02.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
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
# Standard Library
from itertools import combinations
# From apps
from utils.point import Point
class Task02:
@classmethod
def solve(cls, file_content: list[str]) -> int:
map = []
for line in file_content:
map.append(list(line))
locations_of_pairs = cls.get_antenna_pairs(map)
# [
# (point(1,1),point(2,2)),
# (point(1,1),point(2,2)),
# (point(1,1),point(2,2)),
# ]
antinodes = set()
for point_01, point_02 in locations_of_pairs:
tmp_antinodes = cls.get_antinodes(point_01, point_02, len(map[0]), len(map))
for tmp_antinode in tmp_antinodes:
antinodes.add(tmp_antinode)
return len(antinodes)
@classmethod
def get_antenna_pairs(cls, map: list[list[str]]) -> list[tuple[Point, Point]]:
antenna_pairs = []
# build a dict of all populated squares
antennas: dict[str, list[Point]] = {}
for x in range(len(map[0])):
for y in range(len(map)):
content = map[y][x]
if content != ".":
location_list = antennas.get(content, list())
location_list.append(Point(x, y))
antennas[content] = location_list
for key, value in antennas.items():
new_combos = list(combinations(value, 2))
antenna_pairs.extend(new_combos)
return antenna_pairs
@classmethod
def get_antinodes(cls, point_01: Point, point_02: Point, width, height) -> set[Point]:
dx = point_01.x - point_02.x
dy = point_01.y - point_02.y
antinodes = set()
antinodes.add(point_01)
antinodes.add(point_02)
next_node_01 = point_01
next_node_02 = point_02
done = False
while not done:
antinode01 = Point(next_node_01.x + dx, next_node_01.y + dy)
antinode02 = Point(next_node_02.x - dx, next_node_02.y - dy)
added = False
if antinode01.is_in_bounds(0, 0, width, height):
antinodes.add(antinode01)
next_node_01 = antinode01
added = True
if antinode02.is_in_bounds(0, 0, width, height):
antinodes.add(antinode02)
next_node_02 = antinode02
added = True
done = not added
return antinodes