Skip to content

Commit 1f1aa9f

Browse files
committed
2024 day 14 part 2 testable solution
1 parent 83627c2 commit 1f1aa9f

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

src/year2024/day14b.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
"""2024 - Day 14 Part 2: Restroom Redoubt"""
22

3+
import sys
34
from dataclasses import dataclass
5+
from itertools import combinations
46

57
from src.year2024.day14a import Robot
68

79

10+
def distance(r1: Robot, r2: Robot) -> int:
11+
return abs(r1.x - r2.x) + abs(r1.y - r2.y)
12+
13+
814
@dataclass
915
class Field:
1016
width: int
@@ -16,6 +22,10 @@ def make_step(self) -> None:
1622
robot.x = (robot.x + robot.dx) % self.width
1723
robot.y = (robot.y + robot.dy) % self.height
1824

25+
@property
26+
def entropy(self) -> int:
27+
return sum(distance(a, b) for a, b in combinations(self.robots, 2))
28+
1929
def __str__(self) -> str:
2030
data = [[" " for _ in range(self.width)] for _ in range(self.height)]
2131
for robot in self.robots:
@@ -27,9 +37,15 @@ def solve(task: str, width: int = 101, height: int = 103) -> int:
2737
robots = [Robot.from_line(x) for x in task.split("\n")]
2838
field = Field(width, height, robots)
2939

40+
min_entropy_second = 0
41+
min_entropy_seen = sys.maxsize
42+
3043
for i in range(1, 10_000):
3144
field.make_step()
32-
print("second", i)
33-
print(field)
45+
field_entropy = field.entropy
46+
47+
if field_entropy < min_entropy_seen:
48+
min_entropy_seen = field_entropy
49+
min_entropy_second = i
3450

35-
return -1
51+
return min_entropy_second

tests/src/year2024/test_day14b.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""2024 - Day 14 Part 2: Restroom Redoubt"""
2+
3+
from textwrap import dedent
4+
5+
from src.year2024.day14b import solve
6+
7+
8+
def test_solve():
9+
task = dedent(
10+
"""
11+
p=0,4 v=3,-3
12+
p=6,3 v=-1,-3
13+
p=10,3 v=-1,2
14+
p=2,0 v=2,-1
15+
p=0,0 v=1,3
16+
p=3,0 v=-2,-2
17+
p=7,6 v=-1,-3
18+
p=3,0 v=-1,-2
19+
p=9,3 v=2,3
20+
p=7,3 v=-1,2
21+
p=2,4 v=2,-3
22+
p=9,5 v=-3,-3
23+
"""
24+
).strip()
25+
assert solve(task, width=11, height=7) == 31

0 commit comments

Comments
 (0)