Skip to content

Instantly share code, notes, and snippets.

@terrelln
Last active December 3, 2019 06:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save terrelln/2c86beaca1e6e6809de968b1acd06eda to your computer and use it in GitHub Desktop.
Save terrelln/2c86beaca1e6e6809de968b1acd06eda to your computer and use it in GitHub Desktop.
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