Add day 3 part 2 in Rust

This commit is contained in:
kageru 2019-12-03 23:33:31 +01:00
parent 8b6f5708e5
commit 53dad7ee15
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2

View File

@ -1,4 +1,4 @@
use std::collections::{HashMap, HashSet}; use std::collections::HashMap;
use std::io::{self, BufRead}; use std::io::{self, BufRead};
struct Movement { struct Movement {
@ -15,7 +15,8 @@ impl Movement {
} }
} }
fn make_step(x: &mut i32, y: &mut i32, dir: char) { fn make_step(x: &mut i32, y: &mut i32, steps: &mut i32, dir: char) {
*steps += 1;
match dir { match dir {
'U' => *y += 1, 'U' => *y += 1,
'D' => *y -= 1, 'D' => *y -= 1,
@ -33,24 +34,33 @@ pub fn main() {
.collect::<Vec<_>>() .collect::<Vec<_>>()
}); });
let (first_wire, second_wire) = (input.next().unwrap(), input.next().unwrap()); let (first_wire, second_wire) = (input.next().unwrap(), input.next().unwrap());
let mut first_wire_positions = HashSet::new(); let mut first_wire_positions = HashMap::new();
let (mut x, mut y) = (0, 0); let (mut x, mut y, mut steps) = (0, 0, 0);
for m in first_wire { for m in first_wire {
for _ in 0..m.distance { for _ in 0..m.distance {
make_step(&mut x, &mut y, m.direction); make_step(&mut x, &mut y, &mut steps, m.direction);
first_wire_positions.insert((x, y)); first_wire_positions.insert((x, y), steps);
} }
} }
x = 0; x = 0;
y = 0; y = 0;
steps = 0;
let mut intersections = HashMap::new(); let mut intersections = HashMap::new();
for m in second_wire { for m in second_wire {
for _ in 0..m.distance { for _ in 0..m.distance {
make_step(&mut x, &mut y, m.direction); make_step(&mut x, &mut y, &mut steps, m.direction);
if first_wire_positions.contains(&(x, y)) { first_wire_positions
intersections.insert((x, y), 0); .get(&(x, y))
} .map(|s| intersections.insert((x, y), s + steps));
} }
} }
println!("Part 1: {}", intersections.keys().map(|(x, y)| x.abs() + y.abs()).min().unwrap()); println!(
"Part 1: {}",
intersections
.keys()
.map(|(x, y)| x.abs() + y.abs())
.min()
.unwrap()
);
println!("Part 2: {}", intersections.values().min().unwrap());
} }