diff --git a/2021/17/README.md b/2021/17/README.md new file mode 100644 index 0000000..e4b56b0 --- /dev/null +++ b/2021/17/README.md @@ -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?** diff --git a/2021/17/code.py b/2021/17/code.py new file mode 100644 index 0000000..7e12cc4 --- /dev/null +++ b/2021/17/code.py @@ -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)}") diff --git a/2021/17/input.txt b/2021/17/input.txt new file mode 100644 index 0000000..69a53f1 --- /dev/null +++ b/2021/17/input.txt @@ -0,0 +1 @@ +target area: x=195..238, y=-93..-67 diff --git a/2021/17/solution.txt b/2021/17/solution.txt new file mode 100644 index 0000000..f67c1e2 --- /dev/null +++ b/2021/17/solution.txt @@ -0,0 +1,2 @@ +Part 1: 4278 +Part 2: 1994 diff --git a/2021/17/test_code.py b/2021/17/test_code.py new file mode 100644 index 0000000..595dad6 --- /dev/null +++ b/2021/17/test_code.py @@ -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() diff --git a/2021/17/test_input.txt b/2021/17/test_input.txt new file mode 100644 index 0000000..a07e02d --- /dev/null +++ b/2021/17/test_input.txt @@ -0,0 +1 @@ +target area: x=20..30, y=-10..-5 diff --git a/2021/README.md b/2021/README.md index d143f83..ff43909 100644 --- a/2021/README.md +++ b/2021/README.md @@ -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 | | | | |