Skip to content

Commit e5e981b

Browse files
committed
Day 18
1 parent ee51b7f commit e5e981b

File tree

7 files changed

+371
-1
lines changed

7 files changed

+371
-1
lines changed

15/2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def solve(start, end, nodes):
2323
def h(node):
2424
return abs(max_x-node[0]) + abs(max_y-node[0])
2525

26-
open_set = [(0, start[0], start[1])]
26+
open_set = [(float(0), int(start[0]), int(start[1]))]
2727
heapq.heapify(open_set)
2828

2929
came_from = {}

17/1.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
2+
import re
3+
4+
5+
def solve(x_bounds, y_bounds):
6+
hits = []
7+
velocities = []
8+
for x in range(0, 130):
9+
for y in range(min(y_bounds), 150):
10+
velocities.append((x, y))
11+
12+
for velocity in velocities:
13+
new_velocity = velocity
14+
pos = (0, 0)
15+
steps = []
16+
while pos[1] >= min(y_bounds):
17+
steps.append(pos)
18+
pos = (pos[0]+new_velocity[0], pos[1]+new_velocity[1])
19+
20+
if pos[0] >= x_bounds[0] and pos[0] <= x_bounds[1] and pos[1] >= y_bounds[0] and pos[1] <= y_bounds[1]:
21+
hits.append(velocity)
22+
break
23+
24+
new_x_velocity = new_velocity[0]
25+
if new_x_velocity > 0:
26+
new_x_velocity -= 1
27+
elif new_x_velocity < 0:
28+
new_x_velocity += 1
29+
new_velocity = (new_x_velocity, new_velocity[1]-1)
30+
31+
return len(hits)
32+
33+
34+
if __name__ == "__main__":
35+
with open('./input', 'r') as f:
36+
x1, x2, y1, y2 = map(int, re.findall('-?\d+', f.read().strip()))
37+
x_bounds, y_bounds = (x1, x2), (y1, y2)
38+
39+
print(solve(x_bounds, y_bounds))

17/2.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
def solve(lines):
3+
return lines
4+
5+
6+
if __name__ == "__main__":
7+
with open('./input', 'r') as f:
8+
lines = f.read().splitlines()
9+
print(solve(lines))

17/input

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
target area: x=81..129, y=-150..-108

18/1_2.py

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
2+
import math
3+
from collections import deque
4+
5+
6+
class Node:
7+
left = None
8+
right = None
9+
parent = None
10+
11+
def __init__(self, number=None):
12+
if number:
13+
self.set_left(number[0])
14+
self.set_right(number[1])
15+
16+
def set_left(self, node):
17+
if type(node) == list:
18+
node = Node(node)
19+
20+
self.left = node
21+
22+
if type(node) == Node:
23+
node.parent = self
24+
25+
def set_right(self, node):
26+
if type(node) == list:
27+
node = Node(node)
28+
29+
self.right = node
30+
31+
if type(node) == Node:
32+
node.parent = self
33+
34+
def is_bottom(self):
35+
return type(self.left) == int and type(self.right) == int
36+
37+
def find_depth(self):
38+
depth = 1
39+
n = self
40+
while n.parent:
41+
n = n.parent
42+
depth += 1
43+
return depth
44+
45+
def reduce(self):
46+
node_to_explode = self.find_node_to_explode()
47+
node_to_split = self.find_node_to_split()
48+
while node_to_explode or node_to_split:
49+
if node_to_explode:
50+
node_to_explode.explode()
51+
elif node_to_split:
52+
node_to_split.split()
53+
54+
node_to_explode = self.find_node_to_explode()
55+
node_to_split = self.find_node_to_split()
56+
57+
def split(self):
58+
if type(self.left) == int and self.left > 9:
59+
self.left = Node([self.left//2, math.ceil(self.left/2)])
60+
self.left.parent = self
61+
elif type(self.right) == int and self.right > 9:
62+
self.right = Node([self.right//2, math.ceil(self.right/2)])
63+
self.right.parent = self
64+
65+
def explode(self):
66+
left_node, left_side = self.find_node_with_left_regular_number()
67+
right_node, right_side = self.find_node_with_right_regular_number()
68+
if left_node:
69+
if left_side == 'left':
70+
left_node.left += self.left
71+
else:
72+
left_node.right += self.left
73+
if right_node:
74+
if right_side == 'left':
75+
right_node.left += self.right
76+
else:
77+
right_node.right += self.right
78+
79+
if self.parent.left == self:
80+
self.parent.left = 0
81+
else:
82+
self.parent.right = 0
83+
84+
def magnitude(self):
85+
if type(self.left) == int:
86+
left_m = self.left * 3
87+
else:
88+
left_m = self.left.magnitude() * 3
89+
90+
if type(self.right) == int:
91+
right_m = self.right * 2
92+
else:
93+
right_m = self.right.magnitude() * 2
94+
95+
return left_m + right_m
96+
97+
def find_node_to_explode(self):
98+
S = deque([self])
99+
while len(S):
100+
n = S.popleft()
101+
if n.is_bottom() and n.find_depth() > 4:
102+
return n
103+
if type(n.left) == Node:
104+
S.append(n.left)
105+
if type(n.right) == Node:
106+
S.append(n.right)
107+
108+
def find_node_to_split(self):
109+
if type(self.left) == int and self.left > 9:
110+
return self
111+
112+
if type(self.left) == Node:
113+
left = self.left.find_node_to_split()
114+
if left:
115+
return left
116+
117+
if type(self.right) == int and self.right > 9:
118+
return self
119+
120+
if type(self.right) == Node:
121+
right = self.right.find_node_to_split()
122+
if right:
123+
return right
124+
125+
def find_node_with_left_regular_number(self):
126+
prev = self
127+
node = self.parent
128+
while node and node.left == prev:
129+
prev = node
130+
node = prev.parent
131+
if not node:
132+
return None, None
133+
134+
if type(node.left) == int:
135+
return node, 'left'
136+
node = node.left
137+
while type(node.right) != int:
138+
node = node.right
139+
140+
while type(node.right) != int:
141+
node = node.right
142+
143+
return node, 'right'
144+
145+
def find_node_with_right_regular_number(self):
146+
prev = self
147+
node = self.parent
148+
while node and node.right == prev:
149+
prev = node
150+
node = prev.parent
151+
if not node:
152+
return None, None
153+
154+
if type(node.right) == int:
155+
return node, 'right'
156+
node = node.right
157+
while type(node.left) != int:
158+
node = node.left
159+
160+
while type(node.left) != int:
161+
node = node.left
162+
163+
return node, 'left'
164+
165+
def __repr__(self) -> str:
166+
return f"[{self.left},{self.right}]"
167+
168+
169+
def solve1(lines):
170+
node = None
171+
left_node = Node(eval(lines[0]))
172+
for line in lines[1:]:
173+
node = Node()
174+
right_node = Node(eval(line))
175+
176+
node.set_left(left_node)
177+
node.set_right(right_node)
178+
node.reduce()
179+
180+
left_node = node
181+
182+
return node.magnitude()
183+
184+
185+
def solve2(lines):
186+
max_magnitude = 0
187+
188+
node = None
189+
for line1 in lines:
190+
for line2 in lines:
191+
if line1 == line2:
192+
continue
193+
194+
node1 = Node(eval(line1))
195+
node2 = Node(eval(line2))
196+
197+
node = Node()
198+
node.set_left(node1)
199+
node.set_right(node2)
200+
201+
node.reduce()
202+
203+
max_magnitude = max(node.magnitude(), max_magnitude)
204+
205+
return max_magnitude
206+
207+
208+
if __name__ == "__main__":
209+
with open('./input', 'r') as f:
210+
lines = f.read().splitlines()
211+
print(solve1(lines))
212+
print(solve2(lines))

18/2.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
def solve(lines):
3+
return lines
4+
5+
6+
if __name__ == "__main__":
7+
with open('./input', 'r') as f:
8+
lines = f.read().splitlines()
9+
print(solve(lines))

18/input

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
[[[[0,6],[8,7]],[2,3]],[3,[[6,5],[0,0]]]]
2+
[[2,[9,[4,9]]],[[[3,0],4],[2,[4,7]]]]
3+
[[[4,[5,2]],[1,[9,7]]],[[2,4],[[4,5],4]]]
4+
[[[[6,7],8],[[6,6],3]],[6,[7,[4,9]]]]
5+
[[[[5,4],[7,4]],[8,[2,3]]],[[[9,7],6],[2,[4,7]]]]
6+
[[[[2,4],[0,9]],6],[[[7,3],[5,9]],[0,[2,3]]]]
7+
[[6,[9,[2,4]]],[[3,0],[1,[0,0]]]]
8+
[[3,7],[3,[2,0]]]
9+
[[0,[2,[4,6]]],[8,9]]
10+
[[[7,5],[[3,8],5]],[[[9,8],[4,3]],[5,[1,4]]]]
11+
[[9,[[4,7],[7,1]]],[[7,[8,7]],[4,[2,6]]]]
12+
[[[0,4],9],[[[5,1],[3,2]],4]]
13+
[[[5,9],2],[8,[3,[2,4]]]]
14+
[[[[2,2],[9,2]],[0,7]],[[[3,7],3],0]]
15+
[5,[[9,1],[[6,6],9]]]
16+
[[5,[1,[1,7]]],[[[2,2],[5,2]],[2,0]]]
17+
[[[[2,0],5],[[6,1],[3,1]]],7]
18+
[4,[2,[3,3]]]
19+
[[[[8,3],[3,2]],[[4,0],3]],[[[2,5],9],4]]
20+
[[[6,4],[[0,8],[4,9]]],[[[7,9],7],[[5,5],[7,8]]]]
21+
[3,7]
22+
[[1,5],[[[3,7],[7,1]],[[7,4],[9,3]]]]
23+
[[3,[0,[4,4]]],[[3,4],[[3,1],0]]]
24+
[[1,[[1,1],[5,1]]],[[[8,0],5],7]]
25+
[[[[9,2],0],2],[8,5]]
26+
[4,[[0,[0,9]],[2,2]]]
27+
[[[4,[2,0]],[[5,5],[8,2]]],[[[5,1],[7,7]],[0,9]]]
28+
[[5,[[0,1],[5,9]]],[3,[8,[8,4]]]]
29+
[[1,9],[[3,[1,0]],[4,3]]]
30+
[[[1,6],[2,8]],[8,[9,3]]]
31+
[[[3,4],0],[4,[8,[5,8]]]]
32+
[[8,[9,0]],[[[6,4],[5,5]],[8,3]]]
33+
[[[[9,1],[3,9]],[1,[8,0]]],[[8,[8,5]],[[2,2],0]]]
34+
[1,[6,[6,7]]]
35+
[[[5,[5,8]],[[0,8],7]],[[7,6],[[7,6],[3,8]]]]
36+
[[8,[1,[8,6]]],[[8,4],[[3,3],1]]]
37+
[7,[9,[5,7]]]
38+
[[[8,9],[9,6]],[[[6,7],[7,4]],[2,[2,6]]]]
39+
[[[2,0],4],[1,[6,[6,0]]]]
40+
[[8,[8,[6,1]]],[[6,1],[[6,5],[2,3]]]]
41+
[4,[2,[[9,6],[3,5]]]]
42+
[6,[[3,7],[6,9]]]
43+
[[[[8,6],9],4],[8,[5,0]]]
44+
[[[[6,6],3],[7,[3,9]]],1]
45+
[[1,[7,5]],[[6,1],[0,[9,3]]]]
46+
[[[3,[6,0]],[2,5]],[[4,3],0]]
47+
[[[[9,2],7],[[3,7],6]],[[1,[9,1]],[[7,1],[7,7]]]]
48+
[[[[0,7],4],2],[5,[[2,1],3]]]
49+
[[[1,2],[[6,4],[8,6]]],[[[7,3],7],[[6,1],[2,1]]]]
50+
[[[[7,6],8],5],[[3,3],[[7,3],9]]]
51+
[[5,[[6,8],0]],[[6,[7,1]],2]]
52+
[[[4,8],[[8,2],[6,5]]],[5,[5,[8,7]]]]
53+
[[6,[[4,8],[5,4]]],[[[1,7],6],[6,9]]]
54+
[8,[8,[3,1]]]
55+
[[8,3],[1,[5,[0,9]]]]
56+
[[2,[[8,3],[5,1]]],[[2,[6,1]],[[4,0],[9,3]]]]
57+
[5,3]
58+
[[[5,3],[[1,2],[4,6]]],[[7,6],[[0,3],0]]]
59+
[[[6,5],8],[2,[8,3]]]
60+
[[[8,6],[0,5]],[[2,4],5]]
61+
[[[1,[4,1]],[[9,4],1]],1]
62+
[[[8,6],[[1,4],[9,3]]],[4,[[4,4],1]]]
63+
[[[2,[4,2]],[1,0]],3]
64+
[[0,2],[7,[7,[8,5]]]]
65+
[[[9,[9,5]],[0,[4,8]]],[[6,[6,7]],[[3,3],1]]]
66+
[1,[[[3,7],[3,2]],3]]
67+
[[0,[[1,6],4]],[[[2,2],[5,9]],2]]
68+
[[5,8],[0,9]]
69+
[[[[9,4],[8,8]],[[7,3],[8,1]]],[1,[7,[7,6]]]]
70+
[[[[7,6],[4,2]],7],[3,[[7,5],[0,9]]]]
71+
[[[5,6],[6,2]],[[8,6],[9,6]]]
72+
[[4,7],[6,9]]
73+
[6,[[0,[7,7]],[1,4]]]
74+
[[[[2,7],2],4],[[[1,8],[0,3]],3]]
75+
[[7,[[1,8],[0,1]]],[[3,0],[[5,0],9]]]
76+
[[[[1,8],[0,3]],2],[[9,5],1]]
77+
[[[[1,2],3],6],[3,[[8,3],[8,8]]]]
78+
[9,[[4,0],2]]
79+
[[[[8,5],6],9],[7,[9,[3,4]]]]
80+
[[[[5,8],[8,5]],0],6]
81+
[[[[0,8],[9,3]],3],[[[6,4],9],[[6,8],5]]]
82+
[[[[2,9],2],0],[[[9,0],[0,7]],[[6,3],[9,8]]]]
83+
[[[0,[0,5]],1],6]
84+
[[[1,[0,5]],9],[[[6,8],[7,4]],[1,[1,1]]]]
85+
[[[6,1],[8,6]],[[1,[0,8]],[[6,7],[1,8]]]]
86+
[[5,[[9,9],6]],[[0,7],[[8,2],[4,5]]]]
87+
[[5,4],[5,[[0,7],[5,7]]]]
88+
[[5,[4,8]],[[5,[0,7]],[8,6]]]
89+
[[[[9,5],2],[3,[9,6]]],[[6,8],[3,8]]]
90+
[[[[1,4],[2,9]],[2,4]],[[1,3],[[0,4],[9,9]]]]
91+
[[0,4],[[7,[1,4]],2]]
92+
[[6,4],[[[2,7],9],2]]
93+
[[[[9,6],6],[[4,7],[3,7]]],[[[4,8],4],[[5,2],[4,8]]]]
94+
[[[[8,8],0],[6,7]],[3,[0,[7,1]]]]
95+
[[[0,[0,3]],7],[[2,0],[6,[4,5]]]]
96+
[[[[0,4],5],[4,[2,6]]],[[9,9],7]]
97+
[1,[8,8]]
98+
[[[4,2],[2,[6,6]]],7]
99+
[7,[3,[4,[2,3]]]]
100+
[0,9]

0 commit comments

Comments
 (0)