From 9269a60cdeac35a43b045f9e6a63125fe21e2696 Mon Sep 17 00:00:00 2001 From: Stephen Waits Date: Fri, 11 Dec 2020 21:56:22 -0800 Subject: [PATCH] day 12 solutions Signed-off-by: Stephen Waits --- data/input-12.txt | 771 +++++++++++++++++++++++++++++++++++++++++++++ data/output-12.txt | 2 + src/day12.rs | 100 ++++++ src/main.rs | 2 + 4 files changed, 875 insertions(+) create mode 100644 data/input-12.txt create mode 100644 data/output-12.txt create mode 100644 src/day12.rs diff --git a/data/input-12.txt b/data/input-12.txt new file mode 100644 index 0000000..bbb1b41 --- /dev/null +++ b/data/input-12.txt @@ -0,0 +1,771 @@ +N2 +S5 +E2 +F35 +N2 +W5 +F83 +S5 +R180 +S3 +L270 +N1 +F35 +N1 +W4 +S3 +L180 +F46 +R180 +S4 +F29 +R90 +S3 +E1 +F65 +E4 +F29 +S4 +E5 +F33 +L90 +F28 +L270 +E3 +S5 +E2 +S5 +F82 +R270 +F81 +S3 +F68 +R180 +W5 +S3 +F70 +W4 +L180 +E2 +L90 +F28 +L270 +S4 +R90 +W2 +F39 +R90 +N5 +W5 +L180 +E3 +F66 +S5 +W3 +N5 +L90 +S2 +W4 +F77 +E1 +L90 +E3 +W1 +S3 +E4 +N4 +W5 +S1 +F55 +S3 +L90 +F20 +W2 +N2 +F23 +W2 +F48 +L90 +N1 +E3 +R90 +N4 +F73 +S4 +F7 +S1 +R90 +R90 +W3 +S3 +F71 +E5 +N1 +W1 +L90 +W3 +R180 +F60 +W2 +S5 +L90 +W2 +F6 +L180 +W4 +S2 +F28 +N4 +F56 +N4 +E4 +L90 +F67 +L90 +N1 +L90 +W3 +F43 +S2 +W4 +S1 +F67 +F72 +E2 +L90 +W2 +L180 +F35 +L90 +N2 +W1 +S5 +F58 +R180 +F68 +E2 +S5 +F61 +W4 +L180 +W2 +S2 +F35 +W4 +F50 +E3 +L90 +E3 +N5 +F16 +E2 +N4 +F87 +W4 +R180 +F25 +N3 +F6 +L90 +F57 +R180 +E2 +R90 +E1 +F99 +W1 +L90 +W4 +F76 +W2 +F48 +S1 +F19 +N1 +F54 +L90 +F66 +E4 +F88 +R90 +S5 +L180 +W2 +R90 +S2 +F54 +L90 +S2 +L180 +S4 +F14 +N2 +F51 +E3 +F83 +N2 +W1 +F61 +S1 +W3 +N2 +F15 +R180 +S3 +E3 +R90 +F50 +R90 +E5 +L90 +F53 +S3 +L90 +S5 +F22 +R90 +S5 +E3 +L90 +E4 +F88 +W1 +F10 +S2 +W4 +F68 +W3 +W2 +S3 +R90 +F1 +S1 +L270 +F51 +S2 +R90 +E3 +F6 +S1 +R90 +W2 +L180 +N1 +W5 +F51 +W1 +N1 +R90 +E1 +S3 +F21 +W3 +R180 +N1 +R180 +N1 +W4 +F21 +R180 +W3 +S5 +E3 +S5 +L180 +F3 +N4 +L90 +W5 +F23 +S3 +N5 +E1 +F88 +L90 +E4 +F18 +E3 +F27 +F51 +E3 +F58 +N5 +R180 +F36 +N4 +E2 +F14 +N4 +L180 +F87 +L180 +E3 +F67 +E4 +L90 +E2 +F62 +E3 +F60 +R90 +W2 +S1 +F47 +S5 +L90 +W2 +F11 +N2 +F29 +S2 +W1 +S1 +W1 +N2 +F73 +N3 +F92 +S2 +F1 +R180 +W4 +R90 +S5 +W4 +F33 +E2 +N2 +F40 +S1 +L180 +S2 +L90 +F95 +E2 +W2 +R180 +F26 +E1 +S3 +S1 +R90 +N4 +W4 +S5 +L90 +N1 +E5 +F9 +W5 +N1 +F89 +R180 +E5 +L90 +N2 +F90 +W4 +F33 +W2 +F62 +E1 +N4 +W4 +S5 +L90 +L90 +F81 +E3 +N5 +F81 +S1 +E3 +F89 +N3 +R90 +N3 +W3 +L90 +N2 +F93 +L90 +F48 +N5 +R180 +F66 +E5 +S1 +F47 +R180 +F61 +L90 +N2 +F74 +N1 +L180 +E2 +S5 +F39 +R180 +N5 +F26 +E5 +F12 +R90 +R90 +S4 +F7 +W5 +L90 +W1 +R90 +W2 +N2 +E2 +N1 +F15 +L90 +W4 +S2 +R90 +E3 +R180 +F86 +N5 +S5 +E2 +R90 +W1 +F64 +S2 +W3 +R180 +S4 +L180 +F58 +L90 +F100 +S2 +E4 +S2 +F52 +W2 +N4 +W4 +R90 +N2 +F45 +E5 +F84 +N3 +W2 +R90 +F36 +R90 +F85 +N5 +L90 +F6 +L90 +S4 +F21 +R90 +E5 +F9 +S4 +F53 +L90 +R90 +E1 +F55 +R90 +F56 +L90 +E4 +L90 +N1 +E1 +L90 +N1 +R90 +F51 +W1 +F39 +S5 +F96 +R90 +S1 +R180 +F72 +E1 +N4 +N3 +F77 +E3 +L90 +W4 +S3 +F53 +F92 +W5 +L90 +E4 +N2 +R180 +R90 +S3 +E2 +S3 +W1 +N1 +F86 +E3 +F46 +W1 +L90 +F97 +W3 +F45 +W4 +F73 +W2 +S2 +R90 +N2 +L180 +N4 +L90 +W1 +N2 +L90 +E1 +F93 +F36 +E2 +F74 +E3 +F49 +W5 +L180 +S3 +F5 +L180 +F53 +S2 +E3 +N1 +F96 +L90 +F44 +S3 +F32 +W1 +S2 +L90 +N2 +E3 +F17 +R90 +F34 +L90 +N4 +F22 +W2 +F58 +S2 +R90 +S2 +R90 +F12 +S5 +W5 +N5 +R90 +N3 +F12 +S4 +E1 +F86 +W3 +F6 +R90 +S5 +L90 +E4 +L180 +N2 +E4 +F50 +S5 +F85 +R90 +F13 +S1 +F69 +S2 +F97 +S1 +F66 +S4 +F86 +N5 +F34 +S2 +W5 +R180 +F42 +W4 +F72 +E3 +R270 +S3 +R90 +E2 +N4 +E5 +R90 +E2 +L180 +S2 +F35 +E4 +S2 +F50 +S1 +R90 +W3 +F100 +N3 +F10 +W4 +L90 +F19 +E2 +F10 +R90 +F27 +S4 +W3 +R90 +F53 +R90 +N3 +L90 +N5 +F46 +R90 +F3 +N1 +S4 +F17 +L270 +E2 +S2 +R90 +N4 +W4 +L180 +E3 +R90 +F86 +N5 +W1 +S4 +R90 +E4 +N4 +E5 +S4 +W1 +L90 +L180 +S1 +F42 +S2 +E2 +S5 +E1 +R90 +W1 +N4 +R90 +N3 +F58 +E3 +S1 +N5 +F65 +N5 +E4 +R180 +N5 +R90 +F90 +N3 +F1 +R180 +S2 +W3 +R90 +W1 +W2 +R180 +S1 +F93 +S2 +F35 +W2 +F62 +L90 +F15 +W3 +F79 +E5 +N4 +R180 +R90 +L90 +E2 +N2 +E5 +L270 +N3 +F31 +W3 +F39 +E5 +N3 +R90 +N2 +E3 +L90 +F50 +L90 +W5 +S3 +F68 +S3 +W3 +F20 +W3 +S2 +F7 +W1 +N1 +R90 +E2 +L180 +W4 +L90 +W4 +N5 +E5 +F19 +F11 +E2 +L90 +S3 +F30 +N2 +E5 +F51 diff --git a/data/output-12.txt b/data/output-12.txt new file mode 100644 index 0000000..4945f8f --- /dev/null +++ b/data/output-12.txt @@ -0,0 +1,2 @@ +1710 +62045 diff --git a/src/day12.rs b/src/day12.rs new file mode 100644 index 0000000..ccf5100 --- /dev/null +++ b/src/day12.rs @@ -0,0 +1,100 @@ +// ==== day 12 + +use crate::utils; +use anyhow::Result; +use std::mem; + +fn navigate(data: &str) -> usize { + let mut heading = 90; + let (mut pos_n, mut pos_e) = (0, 0); + data.lines().for_each(|l| { + let dir = &l[0..1]; + let dist = &l[1..].parse::().expect("int parse error"); + + match dir { + "N" => pos_n += dist, + "S" => pos_n -= dist, + "E" => pos_e += dist, + "W" => pos_e -= dist, + "L" => heading = (heading + 360 - dist) % 360, + "R" => heading = (heading + dist) % 360, + "F" => match heading { + 0 => pos_n += dist, + 90 => pos_e += dist, + 180 => pos_n -= dist, + 270 => pos_e -= dist, + 360 => pos_n += dist, + _ => panic!("non cardinal heading!"), + }, + _ => panic!("bad direction!"), + } + }); + + (pos_n.abs() + pos_e.abs()) as usize +} + +fn navigate2(data: &str) -> usize { + let (mut wpt_n, mut wpt_e) = (1, 10); + let (mut ship_n, mut ship_e) = (0, 0); + data.lines().for_each(|l| { + let dir = &l[0..1]; + let dist = &l[1..].parse::().expect("int parse error"); + + match dir { + "N" => wpt_n += dist, + "S" => wpt_n -= dist, + "E" => wpt_e += dist, + "W" => wpt_e -= dist, + "L" => match dist { + 270 => { + wpt_e = -wpt_e; + mem::swap(&mut wpt_n, &mut wpt_e); + } + 180 => { + wpt_n = -wpt_n; + wpt_e = -wpt_e; + } + 90 => { + wpt_n = -wpt_n; + mem::swap(&mut wpt_n, &mut wpt_e); + } + _ => panic!("bad direction!"), + }, + "R" => match dist { + 90 => { + wpt_e = -wpt_e; + mem::swap(&mut wpt_n, &mut wpt_e); + } + 180 => { + wpt_n = -wpt_n; + wpt_e = -wpt_e; + } + 270 => { + wpt_n = -wpt_n; + mem::swap(&mut wpt_n, &mut wpt_e); + } + _ => panic!("bad direction!"), + }, + "F" => { + ship_n += dist * wpt_n; + ship_e += dist * wpt_e; + } + _ => panic!("bad direction!"), + } + }); + + (ship_n.abs() + ship_e.abs()) as usize +} + +// main +pub fn run() -> Result<(usize, usize)> { + let data = utils::read_file("data/input-12.txt")?; + let answers = utils::read_i64s("data/output-12.txt")?; + + let p1 = navigate(&data); + let p2 = navigate2(&data); + + assert_eq!(p1, answers[0] as usize); + assert_eq!(p2, answers[1] as usize); + Ok((p1, p2)) +} diff --git a/src/main.rs b/src/main.rs index 93e300c..081ae9d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ mod day08; mod day09; mod day10; mod day11; +mod day12; mod utils; // TODO @@ -35,5 +36,6 @@ fn main() -> Result<()> { println!("Day 09: {:?}", day09::run()?); println!("Day 10: {:?}", day10::run()?); println!("Day 11: {:?}", day11::run()?); + println!("Day 12: {:?}", day12::run()?); Ok(()) }