From 260f0cd6c39130aad263b1e7d14c54f326b5c0d5 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Fri, 17 Dec 2021 22:34:59 -0500 Subject: [PATCH] Day 17 --- src/day17.rs | 40 ++++++++++++++++++++++++++++++++++++++++ src/main.rs | 3 ++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/day17.rs diff --git a/src/day17.rs b/src/day17.rs new file mode 100644 index 0000000..90a314f --- /dev/null +++ b/src/day17.rs @@ -0,0 +1,40 @@ +use std::cmp::max; +use std::ops::RangeInclusive; + +pub fn day17() { + solve(&(20..=30), &(-10..=-5)); + solve(&(287..=309), &(-76..=-48)); +} + +fn solve(target_x: &RangeInclusive, target_y: &RangeInclusive) { + let maxes = (0..=*target_x.end()).flat_map(|vx| { + (*target_y.start()..=100).filter_map(move |vy| count_steps(vx, vy, target_x, target_y)) + }); + dbg!(maxes.clone().max()); + dbg!(maxes.count()); +} + +fn count_steps( + mut vx: isize, + mut vy: isize, + target_x: &RangeInclusive, + target_y: &RangeInclusive, +) -> Option { + let mut x = 0; + let mut y = 0; + let mut max_y = 0; + loop { + x += vx; + y += vy; + vx -= vx.signum(); + vy -= 1; + max_y = max(max_y, y); + if target_x.contains(&x) && target_y.contains(&y) { + return Some(max_y); + } else if !target_x.contains(&x) && vx == 0 { + return None; + } else if !target_y.contains(&y) && y < *target_y.start() { + return None; + } + } +} diff --git a/src/main.rs b/src/main.rs index 8a003d7..2c2359e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,8 @@ mod day13; mod day14; mod day15; mod day16; +mod day17; fn main() { - day16::day16(); + day17::day17(); }