From 90f2e88b1f44354a28ada31c43c4bdb8fb9670a5 Mon Sep 17 00:00:00 2001 From: Pascal Lais Date: Fri, 17 Dec 2021 12:01:41 +0100 Subject: [PATCH] Add day 17 solution --- day-17/README.md | 142 +++++++++++++++++++++++++++++++++++++++++++++++ day-17/day-17.py | 75 +++++++++++++++++++++++++ day-17/input.txt | 1 + 3 files changed, 218 insertions(+) create mode 100644 day-17/README.md create mode 100644 day-17/day-17.py create mode 100644 day-17/input.txt diff --git a/day-17/README.md b/day-17/README.md new file mode 100644 index 0000000..11cf49b --- /dev/null +++ b/day-17/README.md @@ -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. `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 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?_ diff --git a/day-17/day-17.py b/day-17/day-17.py new file mode 100644 index 0000000..e08a246 --- /dev/null +++ b/day-17/day-17.py @@ -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) diff --git a/day-17/input.txt b/day-17/input.txt new file mode 100644 index 0000000..54b4754 --- /dev/null +++ b/day-17/input.txt @@ -0,0 +1 @@ +target area: x=25..67, y=-260..-200 \ No newline at end of file