Day 17
This commit is contained in:
parent
c7b9a878ec
commit
e7a41d9400
|
@ -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<isize>, target_y: &RangeInclusive<isize>) {
|
||||
let maxes = (0..=*target_x.end()).flat_map(|vx| {
|
||||
(*target_y.start()..=500).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<isize>,
|
||||
target_y: &RangeInclusive<isize>,
|
||||
) -> Option<isize> {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -15,7 +15,8 @@ mod day13;
|
|||
mod day14;
|
||||
mod day15;
|
||||
mod day16;
|
||||
mod day17;
|
||||
|
||||
fn main() {
|
||||
day16::day16();
|
||||
day17::day17();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue