2021 Day 17
This commit is contained in:
parent
99b0fe5972
commit
9a6c9f4a00
147
2021/17/README.md
Normal file
147
2021/17/README.md
Normal file
@ -0,0 +1,147 @@
|
||||
# 2021 Day 17: Trick Shot
|
||||
Copyright (c) Eric Wastl
|
||||
#### [Direct Link](https://adventofcode.com/2021/day/17)
|
||||
|
||||
## Part 1
|
||||
|
||||
You finally decode the Elves' message. HI, 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 2
|
||||
|
||||
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?**
|
43
2021/17/code.py
Normal file
43
2021/17/code.py
Normal file
@ -0,0 +1,43 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
# Copyright (c) 2021 Akumatic
|
||||
#
|
||||
# https://adventofcode.com/2021/day/17
|
||||
|
||||
def read_file(filename: str = "input.txt") -> list:
|
||||
with open(f"{__file__.rstrip('code.py')}{filename}", "r") as f:
|
||||
lines = [s[2:].split("..") for s in f.read().strip().replace("target area: ", "").split(", ")]
|
||||
return [(int(lines[0][0]), int(lines[0][1])), (int(lines[1][0]), int(lines[1][1]))]
|
||||
|
||||
def fire_probe(vel_x, vel_y, goal_x, goal_y) -> tuple:
|
||||
vx, vy = vel_x, vel_y
|
||||
x, y = 0, 0
|
||||
max_y = 0
|
||||
while x + vx < goal_x.stop:
|
||||
x += vx
|
||||
y += vy
|
||||
max_y = max(y, max_y)
|
||||
vx += 0 if vx == 0 else -1 if vx > 0 else 1
|
||||
vy -= 1
|
||||
if vx == 0 and (x < goal_x.start or y < goal_y.start):
|
||||
break
|
||||
if x in goal_x and y in goal_y:
|
||||
return vel_x, vel_y, max_y
|
||||
return vel_x, vel_y, None
|
||||
|
||||
def brute_force(vals: list):
|
||||
r_x = range(vals[0][0], vals[0][1] + 1)
|
||||
r_y = range(vals[1][0], vals[1][1] + 1)
|
||||
tmp = [fire_probe(x, y, r_x, r_y) for x in range(vals[0][1] + 1) for y in range(-100, 100)]
|
||||
return [velocity for velocity in tmp if velocity[2] is not None]
|
||||
|
||||
def part1(velocities: list) -> int:
|
||||
return max(velocities, key=lambda x: x[2])[2]
|
||||
|
||||
def part2(velocities: list) -> int:
|
||||
return len(velocities)
|
||||
|
||||
if __name__ == "__main__":
|
||||
vals = read_file()
|
||||
vals = brute_force(vals)
|
||||
print(f"Part 1: {part1(vals)}")
|
||||
print(f"Part 2: {part2(vals)}")
|
1
2021/17/input.txt
Normal file
1
2021/17/input.txt
Normal file
@ -0,0 +1 @@
|
||||
target area: x=195..238, y=-93..-67
|
2
2021/17/solution.txt
Normal file
2
2021/17/solution.txt
Normal file
@ -0,0 +1,2 @@
|
||||
Part 1: 4278
|
||||
Part 2: 1994
|
15
2021/17/test_code.py
Normal file
15
2021/17/test_code.py
Normal file
@ -0,0 +1,15 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
# Copyright (c) 2021 Akumatic
|
||||
|
||||
from code import part1, part2, read_file, brute_force
|
||||
|
||||
def test():
|
||||
vals = read_file("test_input.txt")
|
||||
vals = brute_force(vals)
|
||||
assert part1(vals) == 45
|
||||
print("Passed Part 1")
|
||||
assert part2(vals) == 112
|
||||
print("Passed Part 2")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test()
|
1
2021/17/test_input.txt
Normal file
1
2021/17/test_input.txt
Normal file
@ -0,0 +1 @@
|
||||
target area: x=20..30, y=-10..-5
|
@ -31,7 +31,7 @@ Collect stars by solving puzzles. Two puzzles will be made available on each day
|
||||
| 14 | :white_check_mark: | :white_check_mark: | [Solution](14/code.py) | [Day 14](https://adventofcode.com/2021/day/14) |
|
||||
| 15 | :white_check_mark: | :white_check_mark: | [Solution](15/code.py) | [Day 15](https://adventofcode.com/2021/day/15) |
|
||||
| 16 | :white_check_mark: | :white_check_mark: | [Solution](16/code.py) | [Day 16](https://adventofcode.com/2021/day/16) |
|
||||
| 17 | | | | |
|
||||
| 17 | :white_check_mark: | :white_check_mark: | [Solution](17/code.py) | [Day 17](https://adventofcode.com/2021/day/17) |
|
||||
| 18 | | | | |
|
||||
| 19 | | | | |
|
||||
| 20 | | | | |
|
||||
|
Loading…
x
Reference in New Issue
Block a user