From a2b40666189c55ea428379825a1f88eb86407654 Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Fri, 17 Dec 2021 13:58:03 +0100 Subject: [PATCH] Added solution for day 17 --- inputs/day17.txt | 1 + inputs/sample.txt | 2 +- src/bin/day17.rs | 106 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 inputs/day17.txt create mode 100644 src/bin/day17.rs diff --git a/inputs/day17.txt b/inputs/day17.txt new file mode 100644 index 0000000..2fd0935 --- /dev/null +++ b/inputs/day17.txt @@ -0,0 +1 @@ +target area: x=209..238, y=-86..-59 diff --git a/inputs/sample.txt b/inputs/sample.txt index 0d2cbff..a07e02d 100644 --- a/inputs/sample.txt +++ b/inputs/sample.txt @@ -1 +1 @@ -8A004A801A8002F478 +target area: x=20..30, y=-10..-5 diff --git a/src/bin/day17.rs b/src/bin/day17.rs new file mode 100644 index 0000000..f8cac26 --- /dev/null +++ b/src/bin/day17.rs @@ -0,0 +1,106 @@ +use std::cmp::Ordering; +use std::collections::BinaryHeap; +use std::collections::HashMap; +use std::collections::HashSet; +use std::error::Error; +use std::fs::File; +use std::io::{self, BufRead}; +use std::vec::Vec; + +#[macro_use] +extern crate lazy_static; +extern crate regex; + +use regex::Regex; + +fn is_hit( + mut vx: i64, + mut vy: i64, + target_min_x: i64, + target_max_x: i64, + target_min_y: i64, + target_max_y: i64, +) -> (bool, i64) { + let mut x: i64 = 0; + let mut y: i64 = 0; + + let mut max_y = y; + + while x < target_max_x && y > target_min_y { + x += vx; + y += vy; + + if y > max_y { + max_y = y; + } + + if vx != 0 { + vx -= 1; + } + vy -= 1; + + if x >= target_min_x && x <= target_max_x && y >= target_min_y && y <= target_max_y { + return (true, max_y); + } + } + + (false, 0) +} + +fn parse_line(line: &str) -> (i64, i64, i64, i64) { + lazy_static! { + static ref LINE_RE: Regex = + Regex::new(r"^target area: x=([0-9]+)\.\.([0-9]+), y=(-[0-9]+)\.\.(-[0-9]+)$").unwrap(); + } + + let cap = LINE_RE.captures_iter(&line).nth(0).unwrap(); + + ( + cap[1].parse::().unwrap(), + cap[2].parse::().unwrap(), + cap[3].parse::().unwrap(), + cap[4].parse::().unwrap(), + ) +} + +fn main() -> Result<(), Box> { + let file = File::open("inputs/day17.txt")?; + let line: String = io::BufReader::new(file).lines().next().unwrap()?; + + let target = parse_line(&line); + + let mut max_y = 0; + let mut max_velocities = (0, 0); + + for vx in 0..256 { + for vy in 0..246 { + let (hit, local_max_y) = is_hit(vx, vy, target.0, target.1, target.2, target.3); + if hit { + println!("Hit {} {}: {}", vx, vy, max_y); + if local_max_y > max_y { + max_y = local_max_y; + max_velocities = (vx, vy); + } + } + } + } + + println!("Velocities: {},{}", max_velocities.0, max_velocities.1); + println!("Answer1: {}", max_y); + + let mut hits = 0; + + for vx in -256..256 { + for vy in -256..246 { + let (hit, local_max_y) = is_hit(vx, vy, target.0, target.1, target.2, target.3); + if hit { + println!("Hit {} {}: {}", vx, vy, local_max_y); + hits += 1; + } + } + } + + println!("Answer2: {}", hits); + + Ok(()) +}