Skip to content

Commit 4caea82

Browse files
committed
Day 23 ⭐
1 parent 7e86ce9 commit 4caea82

File tree

4 files changed

+192
-1
lines changed

4 files changed

+192
-1
lines changed

2023/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,7 @@ Absolute ugly brute force. Best not to run this...
164164
- Assumed the bricks were sorted like in the example...
165165
- First time, I gave a bunch of wrong answers... Simulating the move now, then moving.
166166
- Thought I had to find the maximum number of bricks that would fall... Not the sum...
167+
168+
### 2023-12-23
169+
170+
- Forgot an enumerate

2023/day23.py

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
from day import Day
2+
from aocd import submit
3+
from heapq import heappush, heappop
4+
5+
6+
class Clouds:
7+
def __init__(self, data):
8+
self.parse(data)
9+
self.max = len(self.grid)
10+
self.visited = set()
11+
12+
def __repr__(self):
13+
return f"Clouds({self.start}, {self.end})"
14+
15+
def parse(self, data):
16+
self.grid = {}
17+
self.start = None
18+
self.end = None
19+
for i, line in enumerate(data):
20+
for ii, char in enumerate(line):
21+
if char != "#":
22+
self.grid[i + ii * 1j] = char
23+
if i == 0:
24+
self.start = i + ii * 1j
25+
if i == len(data) - 1:
26+
self.end = i + ii * 1j
27+
28+
def get_neighbors(self, pos):
29+
for i in [1j, -1j, 1, -1]:
30+
yield pos - i
31+
32+
def longest_hike(self):
33+
dummy = 0
34+
queue = [(0, dummy, self.start, set())]
35+
36+
max_dist = 0
37+
while queue:
38+
dist, _, pos, visited = heappop(queue)
39+
if pos in visited:
40+
continue
41+
visited.add(pos)
42+
if pos == self.end:
43+
if max_dist > dist:
44+
self.visited = visited
45+
max_dist = dist
46+
47+
match self.grid[pos]:
48+
case "<":
49+
neighbors = (pos - 1j,)
50+
case ">":
51+
neighbors = (pos + 1j,)
52+
case "^":
53+
neighbors = (pos - 1,)
54+
case "v":
55+
neighbors = (pos + 1,)
56+
case ".":
57+
neighbors = self.get_neighbors(pos)
58+
for neighbor in neighbors:
59+
if neighbor in self.grid:
60+
heappush(queue, (dist - 1, dummy := dummy + 1, neighbor, visited.copy()))
61+
return -max_dist
62+
63+
def print(self):
64+
for i in range(1 + int(max(x.real for x in self.grid))):
65+
for ii in range(1 + int(max(x.imag for x in self.grid))):
66+
if i + ii * 1j in self.visited:
67+
print("O", end="")
68+
elif i + ii * 1j == self.start:
69+
print("S", end="")
70+
elif i + ii * 1j == self.end:
71+
print("E", end="")
72+
else:
73+
print(self.grid.get(i + ii * 1j, "#"), end="")
74+
print()
75+
76+
77+
def main(day, part=1):
78+
clouds = Clouds(day.data)
79+
print(clouds)
80+
clouds.longest_hike()
81+
clouds.print()
82+
if part == 1:
83+
return clouds.longest_hike()
84+
if part == 2:
85+
pass
86+
87+
88+
if __name__ == "__main__":
89+
day = Day(23)
90+
day.download()
91+
92+
day.load()
93+
# data = """#.#####################
94+
# #.......#########...###
95+
# #######.#########.#.###
96+
# ###.....#.>.>.###.#.###
97+
# ###v#####.#v#.###.#.###
98+
# ###.>...#.#.#.....#...#
99+
# ###v###.#.#.#########.#
100+
# ###...#.#.#.......#...#
101+
# #####.#.#.#######.#.###
102+
# #.....#.#.#.......#...#
103+
# #.#####.#.#.#########v#
104+
# #.#...#...#...###...>.#
105+
# #.#.#v#######v###.###v#
106+
# #...#.>.#...>.>.#.###.#
107+
# #####v#.#.###v#.#.###.#
108+
# #.....#...#...#.#.#...#
109+
# #.#########.###.#.#.###
110+
# #...###...#...#...#.###
111+
# ###.###.#.###v#####v###
112+
# #...#...#.#.>.>.#.>.###
113+
# #.###.###.#.###.#.#v###
114+
# #.....###...###...#...#
115+
# #####################.#"""
116+
117+
# day.load(data)
118+
p1 = main(day)
119+
print(p1)
120+
submit(p1, part="a", day=23, year=2023)
121+
122+
# day.load()
123+
# p2 = main(day, part=2)
124+
# print(p2)
125+
# submit(p2, part="b", day=23, year=2023)

2023/tests/test_day23.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import sys
2+
import pytest
3+
4+
sys.path.insert(0, ".")
5+
from day import Day
6+
from day23 import *
7+
8+
9+
@pytest.fixture(scope="function")
10+
def example():
11+
day = Day(23)
12+
data = """#.#####################
13+
#.......#########...###
14+
#######.#########.#.###
15+
###.....#.>.>.###.#.###
16+
###v#####.#v#.###.#.###
17+
###.>...#.#.#.....#...#
18+
###v###.#.#.#########.#
19+
###...#.#.#.......#...#
20+
#####.#.#.#######.#.###
21+
#.....#.#.#.......#...#
22+
#.#####.#.#.#########v#
23+
#.#...#...#...###...>.#
24+
#.#.#v#######v###.###v#
25+
#...#.>.#...>.>.#.###.#
26+
#####v#.#.###v#.#.###.#
27+
#.....#...#...#.#.#...#
28+
#.#########.###.#.#.###
29+
#...###...#...#...#.###
30+
###.###.#.###v#####v###
31+
#...#...#.#.>.>.#.>.###
32+
#.###.###.#.###.#.#v###
33+
#.....###...###...#...#
34+
#####################.#"""
35+
36+
day.load(data)
37+
return day
38+
39+
40+
@pytest.fixture(scope="function")
41+
def day():
42+
day = Day(23)
43+
day.load()
44+
return day
45+
46+
47+
## Part 1
48+
def test_example(example):
49+
assert main(example, part=1) == 94
50+
51+
52+
def test_part1(day):
53+
assert main(day, part=1) == 2206
54+
55+
56+
## Part 2
57+
def test_example_p2(example):
58+
assert main(example, part=2) == 154
59+
60+
61+
def test_part2(day):
62+
assert main(day, part=2) == False

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ Get acquainted with Advent of Code and solve some of the puzzles in Python.
6767

6868
| | 14th | 15th | 16th | 17th | 18th | 19th | 20th | 21st | 22nd | 23rd | 24th | 25th |
6969
| ------ | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- |
70-
| Part 1 |||||||| <!--2023.21.1--> || <!--2023.23.1--> | <!--2023.24.1--> | <!--2023.25.1--> |
70+
| Part 1 |||||||| <!--2023.21.1--> || | <!--2023.24.1--> | <!--2023.25.1--> |
7171
| Part 2 |||||||| <!--2023.21.2--> || <!--2023.23.2--> | <!--2023.24.2--> | <!--2023.25.2--> |
7272

7373
### [2022](./2022/)

0 commit comments

Comments
 (0)