Last active
December 3, 2019 06:34
-
-
Save terrelln/2c86beaca1e6e6809de968b1acd06eda to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::collections::HashMap; | |
fn to_wire(wire: &str) -> HashMap<(i32, i32), i32> { | |
let mut c: (i32, i32) = (0, 0); | |
let mut v = HashMap::new(); | |
let mut s = 1; | |
for dir in wire.split(",") { | |
let n: i32 = dir[1..].parse().unwrap(); | |
for _ in 0..n { | |
if dir.starts_with("L") { | |
c.0 -= 1; | |
} else if dir.starts_with("R") { | |
c.0 += 1; | |
} else if dir.starts_with("U") { | |
c.1 -= 1; | |
} else if dir.starts_with("D") { | |
c.1 += 1; | |
} | |
v.entry(c).or_insert(s); | |
s += 1; | |
} | |
} | |
v | |
} | |
fn find_intersection(w1: HashMap<(i32, i32), i32>, w2: HashMap<(i32, i32), i32>) -> (i32, i32) { | |
let mut m1: i32 = std::i32::MAX; | |
let mut m2: i32 = std::i32::MAX; | |
for (p, s1) in &w1 { | |
let m = w2.get(p); | |
if let Some(s2) = m { | |
let d1 = p.0.abs() + p.1.abs(); | |
if d1 < m1 { | |
m1 = d1; | |
} | |
let d2 = s1 + s2; | |
if d2 < m2 { | |
m2 = d2; | |
} | |
} | |
} | |
(m1, m2) | |
} | |
fn run(input: &str) -> (i32, i32) { | |
let wires: Vec<&str> = input.split("\n").collect(); | |
let wire1 = to_wire(wires[0]); | |
let wire2 = to_wire(wires[1]); | |
find_intersection(wire1, wire2) | |
} | |
fn main() { | |
let input = include_str!("../input/2019-03"); | |
let (p1, p2) = run(input); | |
println!("p1: {}", p1); | |
println!("p1: {}", p2); | |
} | |
#[cfg(test)] | |
mod tests { | |
use super::*; | |
#[test] | |
fn test1() { | |
let (p1, p2) = run("R75,D30,R83,U83,L12,D49,R71,U7,L72\nU62,R66,U55,R34,D71,R55,D58,R83"); | |
assert_eq!(p1, 159); | |
assert_eq!(p2, 610); | |
} | |
#[test] | |
fn test2() { | |
let (p1, p2) = run("R98,U47,R26,D63,R33,U87,L62,D20,R33,U53,R51\nU98,R91,D20,R16,D67,R40,U7,R15,U6,R7"); | |
assert_eq!(p1, 135); | |
assert_eq!(p2, 410); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment