Skip to content

Commit 659bf0f

Browse files
committed
Day 17 part 2 solutions
1 parent 3305895 commit 659bf0f

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed

17-2.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/usr/bin/env python
2+
3+
import re
4+
5+
line = open('17.input').read().strip()
6+
7+
target_format = re.compile("^target area: x=(?P<x1>[0-9\-]+)..(?P<x2>[0-9\-]+), y=(?P<y1>[0-9\-]+)..(?P<y2>[0-9\-]+)$")
8+
9+
m = target_format.match(line)
10+
11+
x_min = int(m['x1'])
12+
x_max = int(m['x2'])
13+
y_min = int(m['y1'])
14+
y_max = int(m['y2'])
15+
16+
# Possible x velocities:
17+
# Maximum: hits x_max on the first time step
18+
x_vel_max = x_max
19+
20+
# Minimum: decellerates to x_vel=0 before x_min
21+
# Distance travelled = (1 + x_vel) * x_vel / 2
22+
# start ^ ^ end ^ x_steps
23+
x_vel_min = 0
24+
for x_vel in range(x_min):
25+
if (1 + x_vel) * x_vel / 2 >= x_min:
26+
x_vel_min = x_vel
27+
break
28+
29+
# Possible y velocities:
30+
# Maximum: lobs up, hits y=0 at launch velocity, hits y=y_min at next step
31+
y_vel_max = abs(y_min) - 1
32+
33+
# Minimum: directly to y_min at first step
34+
y_vel_min = y_min
35+
36+
37+
def simulate(x_vel, y_vel, x_min, x_max, y_min, y_max):
38+
x = 0
39+
y = 0
40+
while x <= x_max and y >= y_min:
41+
if x >= x_min and x <= x_max and \
42+
y >= y_min and y <= y_max:
43+
return True
44+
45+
x += x_vel
46+
y += y_vel
47+
if x_vel > 0:
48+
x_vel -= 1
49+
y_vel -= 1
50+
51+
return False
52+
53+
54+
count = 0
55+
for x_vel in range(x_vel_min, x_vel_max + 1):
56+
for y_vel in range(y_vel_min, y_vel_max + 1):
57+
if simulate(x_vel, y_vel, x_min, x_max, y_min, y_max):
58+
count += 1
59+
60+
print(count)

17-2.rb

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/usr/bin/env ruby
2+
3+
input = File.read('17.input').strip
4+
5+
target_format = /^target area: x=(?<x1>[[:digit:]\-]+)..(?<x2>[[:digit:]\-]+), y=(?<y1>[[:digit:]\-]+)..(?<y2>[[:digit:]\-]+)$/
6+
7+
m = target_format.match(input)
8+
9+
x_min = m['x1'].to_i
10+
x_max = m['x2'].to_i
11+
y_min = m['y1'].to_i
12+
y_max = m['y2'].to_i
13+
14+
# Possible x velocities:
15+
# Maximum: hits x_max on the first time step
16+
x_vel_max = x_max
17+
18+
# Minimum: decellerates to x_vel=0 before x_min
19+
# Distance travelled = (1 + x_vel) * x_vel / 2
20+
# start ^ ^ end ^ x_steps
21+
x_vel_min = 0
22+
x_min.times do |x_vel|
23+
if (1 + x_vel) * x_vel / 2 >= x_min
24+
x_vel_min = x_vel
25+
break
26+
end
27+
end
28+
29+
# Possible y velocities:
30+
# Maximum: lobs up, hits y=0 at launch velocity, hits y=y_min at next step
31+
y_vel_max = y_min.abs - 1
32+
33+
# Minimum: directly to y_min at first step
34+
y_vel_min = y_min
35+
36+
def simulate(x_vel, y_vel, x_min, x_max, y_min, y_max)
37+
x = 0
38+
y = 0
39+
while x <= x_max and y >= y_min
40+
return true if
41+
x >= x_min and x <= x_max and
42+
y >= y_min and y <= y_max
43+
44+
x += x_vel
45+
y += y_vel
46+
x_vel -= 1 if x_vel.positive?
47+
y_vel -= 1
48+
end
49+
false
50+
end
51+
52+
count = 0
53+
x_vel_min.upto(x_vel_max) do |x_vel|
54+
y_vel_min.upto(y_vel_max) do |y_vel|
55+
if simulate(x_vel, y_vel, x_min, x_max, y_min, y_max)
56+
count += 1
57+
end
58+
end
59+
end
60+
print count, "\n"

0 commit comments

Comments
 (0)