Add day 17 solution
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2021-12-17 12:01:41 +01:00
parent 14855dcc2d
commit 90f2e88b1f
3 changed files with 218 additions and 0 deletions

142
day-17/README.md Normal file
View 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
View 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
View File

@@ -0,0 +1 @@
target area: x=25..67, y=-260..-200