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(); }