This commit is contained in:
142
day-17/README.md
Normal file
142
day-17/README.md
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
# Day 17: Trick Shot
|
||||||
|
|
||||||
|
[https://adventofcode.com/2021/day/17](https://adventofcode.com/2021/day/17)
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
### Part One
|
||||||
|
|
||||||
|
You finally decode the Elves' message. `<span title="Maybe you need to turn the message 90 degrees counterclockwise?">HI</span>`, the message says. You continue searching for the sleigh keys.
|
||||||
|
|
||||||
|
Ahead of you is what appears to be a large [ocean trench](https://en.wikipedia.org/wiki/Oceanic_trench). Could the keys have fallen into it? You'd better send a probe to investigate.
|
||||||
|
|
||||||
|
The probe launcher on your submarine can fire the probe with any [integer](https://en.wikipedia.org/wiki/Integer) velocity in the `x` (forward) and `y` (upward, or downward if negative) directions. For example, an initial `x,y` velocity like `0,10` would fire the probe straight up, while an initial velocity like `10,-1` would fire the probe forward at a slight downward angle.
|
||||||
|
|
||||||
|
The probe's `x,y` position starts at `0,0`. Then, it will follow some trajectory by moving in _steps_. On each step, these changes occur in the following order:
|
||||||
|
|
||||||
|
* The probe's `x` position increases by its `x` velocity.
|
||||||
|
* The probe's `y` position increases by its `y` velocity.
|
||||||
|
* Due to drag, the probe's `x` velocity changes by `1` toward the value `0`; that is, it decreases by `1` if it is greater than `0`, increases by `1` if it is less than `0`, or does not change if it is already `0`.
|
||||||
|
* Due to gravity, the probe's `y` velocity decreases by `1`.
|
||||||
|
|
||||||
|
For the probe to successfully make it into the trench, the probe must be on some trajectory that causes it to be within a _target area_ after any step. The submarine computer has already calculated this target area (your puzzle input). For example:
|
||||||
|
|
||||||
|
target area: x=20..30, y=-10..-5
|
||||||
|
|
||||||
|
This target area means that you need to find initial `x,y` velocity values such that after any step, the probe's `x` position is at least `20` and at most `30`, _and_ the probe's `y` position is at least `-10` and at most `-5`.
|
||||||
|
|
||||||
|
Given this target area, one initial velocity that causes the probe to be within the target area after any step is `7,2`:
|
||||||
|
|
||||||
|
.............#....#............
|
||||||
|
.......#..............#........
|
||||||
|
...............................
|
||||||
|
S........................#.....
|
||||||
|
...............................
|
||||||
|
...............................
|
||||||
|
...........................#...
|
||||||
|
...............................
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTT#TT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
|
||||||
|
|
||||||
|
In this diagram, `S` is the probe's initial position, `0,0`. The `x` coordinate increases to the right, and the `y` coordinate increases upward. In the bottom right, positions that are within the target area are shown as `T`. After each step (until the target area is reached), the position of the probe is marked with `#`. (The bottom-right `#` is both a position the probe reaches and a position in the target area.)
|
||||||
|
|
||||||
|
Another initial velocity that causes the probe to be within the target area after any step is `6,3`:
|
||||||
|
|
||||||
|
...............#..#............
|
||||||
|
...........#........#..........
|
||||||
|
...............................
|
||||||
|
......#..............#.........
|
||||||
|
...............................
|
||||||
|
...............................
|
||||||
|
S....................#.........
|
||||||
|
...............................
|
||||||
|
...............................
|
||||||
|
...............................
|
||||||
|
.....................#.........
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................T#TTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
|
||||||
|
|
||||||
|
Another one is `9,0`:
|
||||||
|
|
||||||
|
S........#.....................
|
||||||
|
.................#.............
|
||||||
|
...............................
|
||||||
|
........................#......
|
||||||
|
...............................
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTT#
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
....................TTTTTTTTTTT
|
||||||
|
|
||||||
|
|
||||||
|
One initial velocity that _doesn't_ cause the probe to be within the target area after any step is `17,-4`:
|
||||||
|
|
||||||
|
S..............................................................
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
.................#.............................................
|
||||||
|
....................TTTTTTTTTTT................................
|
||||||
|
....................TTTTTTTTTTT................................
|
||||||
|
....................TTTTTTTTTTT................................
|
||||||
|
....................TTTTTTTTTTT................................
|
||||||
|
....................TTTTTTTTTTT..#.............................
|
||||||
|
....................TTTTTTTTTTT................................
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
................................................#..............
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
...............................................................
|
||||||
|
..............................................................#
|
||||||
|
|
||||||
|
|
||||||
|
The probe appears to pass through the target area, but is never within it after any step. Instead, it continues down and to the right - only the first few steps are shown.
|
||||||
|
|
||||||
|
If you're going to fire a highly scientific probe out of a super cool probe launcher, you might as well do it with _style_. How high can you make the probe go while still reaching the target area?
|
||||||
|
|
||||||
|
In the above example, using an initial velocity of `6,9` is the best you can do, causing the probe to reach a maximum `y` position of _`45`_. (Any higher initial `y` velocity causes the probe to overshoot the target area entirely.)
|
||||||
|
|
||||||
|
Find the initial velocity that causes the probe to reach the highest `y` position and still eventually be within the target area after any step. _What is the highest `y` position it reaches on this trajectory?_
|
||||||
|
|
||||||
|
### Part Two
|
||||||
|
|
||||||
|
Maybe a fancy trick shot isn't the best idea; after all, you only have one probe, so you had better not miss.
|
||||||
|
|
||||||
|
To get the best idea of what your options are for launching the probe, you need to find _every initial velocity_ that causes the probe to eventually be within the target area after any step.
|
||||||
|
|
||||||
|
In the above example, there are _`112`_ different initial velocity values that meet these criteria:
|
||||||
|
|
||||||
|
23,-10 25,-9 27,-5 29,-6 22,-6 21,-7 9,0 27,-7 24,-5
|
||||||
|
25,-7 26,-6 25,-5 6,8 11,-2 20,-5 29,-10 6,3 28,-7
|
||||||
|
8,0 30,-6 29,-8 20,-10 6,7 6,4 6,1 14,-4 21,-6
|
||||||
|
26,-10 7,-1 7,7 8,-1 21,-9 6,2 20,-7 30,-10 14,-3
|
||||||
|
20,-8 13,-2 7,3 28,-8 29,-9 15,-3 22,-5 26,-8 25,-8
|
||||||
|
25,-6 15,-4 9,-2 15,-2 12,-2 28,-9 12,-3 24,-6 23,-7
|
||||||
|
25,-10 7,8 11,-3 26,-7 7,1 23,-9 6,0 22,-10 27,-6
|
||||||
|
8,1 22,-8 13,-4 7,6 28,-6 11,-4 12,-4 26,-9 7,4
|
||||||
|
24,-10 23,-8 30,-8 7,0 9,-1 10,-1 26,-5 22,-9 6,5
|
||||||
|
7,5 23,-6 28,-10 10,-2 11,-1 20,-9 14,-2 29,-7 13,-3
|
||||||
|
23,-5 24,-8 27,-9 30,-7 28,-5 21,-10 7,9 6,6 21,-5
|
||||||
|
27,-10 7,2 30,-9 21,-8 22,-7 24,-9 20,-6 6,9 29,-5
|
||||||
|
8,-2 27,-8 30,-5 24,-7
|
||||||
|
|
||||||
|
|
||||||
|
_How many distinct initial velocity values cause the probe to be within the target area after any step?_
|
||||||
75
day-17/day-17.py
Normal file
75
day-17/day-17.py
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def part_1(input):
|
||||||
|
result = 0
|
||||||
|
x, y = input[0].rstrip().replace('target area: ', '').replace(
|
||||||
|
'x=', '').replace('y=', '').split(', ')
|
||||||
|
x_min, x_max = [int(c) for c in x.split('..')]
|
||||||
|
y_min, y_max = [int(c) for c in y.split('..')]
|
||||||
|
vx_0 = 0
|
||||||
|
min_num_steps = 0
|
||||||
|
while True:
|
||||||
|
vx_0 += 1
|
||||||
|
x_end = vx_0 * (vx_0 + 1) / 2
|
||||||
|
if x_min <= x_end <= x_max:
|
||||||
|
min_num_steps = vx_0
|
||||||
|
break
|
||||||
|
elif x_end > x_max:
|
||||||
|
break
|
||||||
|
max_valid_height = 0
|
||||||
|
for vy_0 in range(-y_min):
|
||||||
|
vy = vy_0
|
||||||
|
y_pos = 0
|
||||||
|
max_height = 0
|
||||||
|
while y_pos > y_min:
|
||||||
|
y_pos += vy
|
||||||
|
max_height = max(max_height, y_pos)
|
||||||
|
vy -= 1
|
||||||
|
if y_min <= y_pos <= y_max:
|
||||||
|
max_valid_height = max(max_valid_height, max_height)
|
||||||
|
result = max_valid_height
|
||||||
|
print("Part 1 result:", result)
|
||||||
|
|
||||||
|
|
||||||
|
def part_2(input):
|
||||||
|
result = 0
|
||||||
|
x, y = input[0].rstrip().replace('target area: ', '').replace(
|
||||||
|
'x=', '').replace('y=', '').split(', ')
|
||||||
|
x_min, x_max = [int(c) for c in x.split('..')]
|
||||||
|
y_min, y_max = [int(c) for c in y.split('..')]
|
||||||
|
vx_0 = 0
|
||||||
|
num_steps = 0
|
||||||
|
while True:
|
||||||
|
vx_0 += 1
|
||||||
|
x_end = vx_0 * (vx_0 + 1) / 2
|
||||||
|
if x_min <= x_end <= x_max:
|
||||||
|
num_steps = vx_0
|
||||||
|
elif x_end > x_max:
|
||||||
|
break
|
||||||
|
for vx_0 in range(x_max + 1):
|
||||||
|
for vy_0 in range(y_min, -y_min):
|
||||||
|
vx = vx_0
|
||||||
|
vy = vy_0
|
||||||
|
x_pos = 0
|
||||||
|
y_pos = 0
|
||||||
|
while x_pos < x_max and y_pos > y_min:
|
||||||
|
x_pos += vx
|
||||||
|
y_pos += vy
|
||||||
|
if vx != 0:
|
||||||
|
vx -= 1
|
||||||
|
vy -= 1
|
||||||
|
if x_min <= x_pos <= x_max and \
|
||||||
|
y_min <= y_pos <= y_max:
|
||||||
|
result += 1
|
||||||
|
break
|
||||||
|
print("Part 2 result:", result)
|
||||||
|
|
||||||
|
|
||||||
|
input = list()
|
||||||
|
p = Path(__file__).with_name('input.txt')
|
||||||
|
with open(p) as f:
|
||||||
|
input = f.readlines()
|
||||||
|
part_1(input)
|
||||||
|
part_2(input)
|
||||||
1
day-17/input.txt
Normal file
1
day-17/input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
target area: x=25..67, y=-260..-200
|
||||||
Reference in New Issue
Block a user