Skip to content

Commit 9393fa7

Browse files
authored
Create day24.py
1 parent 89f9335 commit 9393fa7

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

day24.py

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
EAST = 'e'
2+
WEST = 'w'
3+
SOUTHEAST = 'se'
4+
SOUTHWEST = 'sw'
5+
NORTHWEST = 'nw'
6+
NORTHEAST = 'ne'
7+
8+
9+
direction = {
10+
EAST: (+2, 0),
11+
WEST: (-2, 0),
12+
SOUTHEAST: (+1, -1),
13+
SOUTHWEST: (-1, -1),
14+
NORTHEAST: (+1, +1),
15+
NORTHWEST: (-1, +1),
16+
}
17+
18+
19+
def part1(tiles):
20+
black_coord = set()
21+
22+
for tile in tiles:
23+
coord = (0, 0)
24+
for i in tile:
25+
coord = (coord[0] + direction[i][0], coord[1] + direction[i][1])
26+
27+
if coord in black_coord:
28+
black_coord.remove(coord)
29+
else:
30+
black_coord.add(coord)
31+
32+
return len(black_coord)
33+
34+
35+
def count_adjacent_black_tiles(coord: tuple, black_coord: set[tuple]) -> int:
36+
return sum(
37+
1 if (coord[0] + d[0], coord[1] + d[1]) in black_coord else 0
38+
for d in direction.values()
39+
)
40+
41+
42+
def part2(tiles):
43+
# Copied from part 1
44+
black_coord = set()
45+
46+
for tile in tiles:
47+
coord = (0, 0)
48+
for i in tile:
49+
coord = (coord[0] + direction[i][0], coord[1] + direction[i][1])
50+
51+
if coord in black_coord:
52+
black_coord.remove(coord)
53+
else:
54+
black_coord.add(coord)
55+
56+
# Core logic for part 2
57+
for i in range(100):
58+
new_black_coord = set()
59+
60+
min_x, max_x = float('inf'), float('-inf')
61+
min_y, max_y = float('inf'), float('-inf')
62+
for coord in black_coord:
63+
min_x, max_x = min(min_x, coord[0]), max(max_x, coord[0])
64+
min_y, max_y = min(min_y, coord[1]), max(max_y, coord[1])
65+
66+
for j in range(min_x - 2, max_x + 2 + 1):
67+
for k in range(min_y - 1, max_y + 1 + 1):
68+
coord = (j, k)
69+
count = count_adjacent_black_tiles(coord, black_coord)
70+
71+
if coord in black_coord:
72+
if 0 < count <= 2:
73+
new_black_coord.add(coord)
74+
elif count == 2:
75+
new_black_coord.add(coord)
76+
77+
black_coord = new_black_coord
78+
79+
return len(black_coord)
80+
81+
82+
def extract_data(lines):
83+
tiles = []
84+
for line in lines:
85+
tile = []
86+
ix = 0
87+
while ix < len(line):
88+
if line.startswith((EAST, WEST), ix):
89+
tile.append(line[ix])
90+
ix += 1
91+
else:
92+
tile.append(line[ix:ix+2])
93+
ix += 2
94+
tiles.append(tile)
95+
96+
return tiles
97+
98+
99+
with open('day24-data.txt') as f:
100+
inputs = [
101+
line
102+
for line in f.read().splitlines()
103+
]
104+
105+
print(part1(extract_data(inputs)))
106+
print(part2(extract_data(inputs)))

0 commit comments

Comments
 (0)