diff --git a/2019/03/Cargo.toml b/2019/03/Cargo.toml new file mode 100644 index 0000000..db65fe1 --- /dev/null +++ b/2019/03/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "d3" +version = "0.1.0" +authors = ["kageru "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/2019/03/src/main.rs b/2019/03/src/main.rs new file mode 100644 index 0000000..5681952 --- /dev/null +++ b/2019/03/src/main.rs @@ -0,0 +1,56 @@ +use std::collections::{HashMap, HashSet}; +use std::io::{self, BufRead}; + +struct Movement { + pub direction: char, + pub distance: u16, +} + +impl Movement { + pub fn new(raw: &str) -> Self { + Self { + direction: raw.chars().nth(0).unwrap(), + distance: raw.get(1..).unwrap().parse().unwrap(), + } + } +} + +fn make_step(x: &mut i32, y: &mut i32, dir: char) { + match dir { + 'U' => *y += 1, + 'D' => *y -= 1, + 'L' => *x += 1, + _ => *x -= 1, + }; +} + +pub fn main() { + let stdin = io::stdin(); + let mut input = stdin.lock().lines().map(|s| { + s.unwrap() + .split(',') + .map(|m| Movement::new(m)) + .collect::>() + }); + let (first_wire, second_wire) = (input.next().unwrap(), input.next().unwrap()); + let mut first_wire_positions = HashSet::new(); + let (mut x, mut y) = (0, 0); + for m in first_wire { + for _ in 0..m.distance { + make_step(&mut x, &mut y, m.direction); + first_wire_positions.insert((x, y)); + } + } + x = 0; + y = 0; + let mut intersections = HashMap::new(); + for m in second_wire { + for _ in 0..m.distance { + make_step(&mut x, &mut y, m.direction); + if first_wire_positions.contains(&(x, y)) { + intersections.insert((x, y), 0); + } + } + } + println!("Part 1: {}", intersections.keys().map(|(x, y)| x.abs() + y.abs()).min().unwrap()); +}