From ea839af8500d1ff1cef23576a14c92c508274596 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 12 Dec 2020 08:00:35 +0100 Subject: [PATCH] Implementation day 12 --- 2020/inputs/12.txt | 784 ++++++++++++++++++++++++++++++++++++++++++++ 2020/samples/12.txt | 5 + 2020/src/day12.rs | 99 +++++- 3 files changed, 886 insertions(+), 2 deletions(-) create mode 100644 2020/inputs/12.txt create mode 100644 2020/samples/12.txt diff --git a/2020/inputs/12.txt b/2020/inputs/12.txt new file mode 100644 index 0000000..aaa450e --- /dev/null +++ b/2020/inputs/12.txt @@ -0,0 +1,784 @@ +R90 +F88 +R180 +F98 +S5 +F14 +S4 +L270 +S1 +R90 +F34 +R90 +F96 +N1 +E5 +F94 +R90 +N1 +E1 +R90 +S5 +F59 +S2 +L90 +E2 +L90 +S1 +W3 +N2 +L90 +S1 +F32 +F92 +N1 +F10 +E2 +F92 +N1 +E4 +F68 +W1 +R90 +F53 +N3 +F29 +S1 +R180 +W5 +R90 +E1 +F79 +W2 +R90 +F70 +S2 +F17 +S5 +S3 +F41 +N4 +E5 +F65 +E1 +N4 +E4 +S3 +F1 +N1 +E5 +F73 +S5 +F4 +L90 +F100 +E2 +S5 +E2 +F67 +N3 +F27 +S4 +E4 +F12 +S4 +W3 +W2 +F10 +L90 +N5 +E2 +R90 +W4 +F76 +S5 +F48 +R90 +F28 +L90 +F36 +N4 +F27 +E4 +N3 +F12 +L90 +S1 +R180 +S2 +F77 +E2 +N5 +E3 +S2 +E1 +L90 +E5 +W4 +F3 +W4 +L90 +N2 +E1 +F61 +W4 +F12 +N2 +F41 +W2 +W4 +L90 +W3 +F42 +S5 +W4 +N5 +E5 +F94 +W5 +R90 +W3 +R90 +E2 +S3 +L90 +E1 +S4 +W1 +L90 +E4 +F57 +S3 +S4 +W4 +S1 +W2 +F22 +W5 +L180 +F93 +R90 +N2 +R90 +E5 +R180 +E5 +F22 +R90 +F61 +E4 +L180 +E2 +L90 +W5 +L90 +N1 +E1 +N3 +W3 +L90 +N2 +W4 +S1 +L180 +W5 +S4 +F69 +R90 +N2 +R90 +N3 +R90 +F100 +S2 +L180 +F13 +S4 +E3 +L90 +F88 +W3 +N4 +R90 +W3 +R90 +F19 +E4 +F28 +W3 +R90 +N2 +F5 +W4 +F88 +S3 +L180 +F14 +N4 +R180 +W3 +N1 +F87 +N2 +F73 +S1 +F53 +N1 +L90 +S2 +L180 +W5 +N2 +L90 +R90 +F1 +L90 +E1 +R90 +N3 +F73 +E4 +F58 +S5 +E3 +E4 +F88 +L90 +E3 +L90 +F8 +N2 +W3 +F62 +S3 +F25 +E3 +N5 +F24 +F21 +W1 +S3 +W3 +F18 +S5 +F93 +L90 +N3 +L180 +S5 +F55 +W1 +F38 +L90 +E2 +L180 +F66 +S3 +F55 +R90 +N5 +R90 +F31 +R90 +F70 +L90 +E3 +L90 +E1 +F95 +W3 +E5 +L90 +F58 +R90 +F26 +R90 +L180 +N1 +F14 +L90 +N4 +E5 +S2 +E1 +R90 +W5 +S5 +L90 +S5 +R270 +F96 +L90 +W3 +F48 +S5 +W4 +F76 +L90 +S3 +W5 +S3 +F71 +S1 +F96 +N4 +R90 +E5 +F16 +L270 +N2 +L90 +N2 +R90 +S1 +N2 +R90 +F13 +L90 +N2 +L90 +F67 +R180 +F26 +R270 +R270 +W1 +S4 +R180 +E2 +F86 +S5 +E5 +N4 +W5 +N4 +L90 +E4 +F96 +R180 +F61 +W4 +L90 +F45 +L90 +F62 +E4 +N5 +E4 +R90 +N3 +L90 +F53 +N4 +W1 +L90 +F82 +F33 +N3 +F24 +R90 +F97 +E3 +F13 +N5 +R90 +W4 +N1 +E5 +L90 +E2 +L180 +S2 +F41 +N1 +E2 +S1 +F98 +E2 +R180 +F70 +N4 +F33 +N5 +F64 +R180 +W1 +R180 +F24 +N1 +L180 +W1 +L90 +E1 +N3 +E1 +L90 +W3 +S5 +E4 +L90 +W1 +F26 +L90 +N1 +W2 +F22 +W4 +S1 +R90 +S3 +R90 +F7 +E1 +S5 +W5 +L180 +F55 +E4 +N5 +R90 +F29 +L90 +S3 +F9 +S4 +R270 +F72 +W4 +N3 +L180 +W2 +L90 +S4 +F84 +N1 +F40 +N3 +F100 +N5 +R180 +S4 +R90 +S2 +L90 +W1 +N5 +E4 +S5 +R90 +F23 +L90 +E4 +E1 +R180 +S2 +F81 +S5 +E1 +E1 +R90 +F72 +N2 +W4 +S3 +L180 +N5 +W2 +F50 +W5 +F28 +L90 +E3 +R90 +N2 +N2 +L90 +N5 +F84 +N5 +F85 +W3 +L90 +F55 +E2 +R90 +W5 +R90 +W1 +F4 +N4 +L180 +N1 +E1 +R180 +E4 +L270 +E5 +R90 +F60 +N1 +W5 +N3 +E5 +R90 +F73 +E3 +N4 +W1 +F32 +R90 +E3 +L90 +F91 +E3 +S3 +W2 +L90 +E1 +L90 +E1 +N5 +L180 +F87 +W3 +N4 +F78 +W5 +L90 +F34 +N4 +R90 +E5 +R180 +N2 +F52 +W4 +L90 +E1 +F17 +S2 +E3 +L180 +E3 +E2 +N5 +E5 +R90 +S1 +W3 +N5 +L90 +W1 +F13 +W4 +S4 +N5 +E5 +S4 +F26 +E5 +F59 +W1 +N4 +S4 +L90 +F85 +L90 +W5 +R90 +S1 +E2 +F86 +R90 +S2 +R90 +F72 +L270 +W5 +W4 +L90 +N2 +R90 +F12 +R90 +F21 +R180 +S4 +L180 +E5 +R90 +S5 +W5 +F87 +E3 +R90 +E3 +S1 +L270 +F74 +R90 +S3 +W5 +F3 +R90 +W2 +L90 +F11 +S2 +W3 +R90 +S3 +N1 +W4 +F67 +S1 +E2 +N4 +L270 +E5 +L90 +N1 +E2 +F75 +E1 +L90 +F63 +E4 +R90 +S4 +F62 +N5 +E4 +N4 +F65 +S2 +W2 +F15 +R90 +W3 +W5 +F71 +R90 +S1 +L90 +S1 +F43 +S3 +F82 +L90 +F7 +W1 +S3 +E2 +E1 +S1 +F74 +R90 +N4 +E4 +F12 +W2 +L180 +S2 +E2 +S1 +F5 +N5 +W5 +N5 +S1 +W5 +F42 +S5 +L90 +N2 +F2 +W2 +R90 +S4 +L180 +F53 +W5 +R90 +F38 +L90 +W3 +W3 +F50 +R90 +N4 +F25 +E1 +N5 +E4 +S3 +F50 +L90 +E2 +R180 +F31 +S1 +E5 +F46 +L90 +E3 +F88 +L90 +F95 +N4 +F57 +S4 +E4 +R270 +R90 +E5 +F11 +R90 +N5 +L90 +F54 +N2 +W2 +F32 +N4 +R270 +S2 +F44 +R90 +R90 +W4 +L90 +F78 +F42 +W1 +R90 +N5 +F83 +W2 +L90 +W3 +L180 +S1 +R90 +F38 +S5 +N2 +F46 +W3 +F83 +W3 +R90 +F41 +W1 +R180 +E4 +N1 +F39 +F36 +S3 +L90 +E3 +F42 +N3 +E4 +F60 diff --git a/2020/samples/12.txt b/2020/samples/12.txt new file mode 100644 index 0000000..48c2a50 --- /dev/null +++ b/2020/samples/12.txt @@ -0,0 +1,5 @@ +F10 +N3 +F7 +R90 +F11 \ No newline at end of file diff --git a/2020/src/day12.rs b/2020/src/day12.rs index 414d389..e6a3856 100644 --- a/2020/src/day12.rs +++ b/2020/src/day12.rs @@ -1,12 +1,107 @@ use std::io::Read; +use crate::common::Lines; use crate::Solution; +// Rotate clockwise +fn rotate(amount: i32, (x, y): (i32, i32)) -> (i32, i32) { + debug_assert!(amount >= 0); + debug_assert_eq!(amount % 90, 0); + + match amount { + 90 => (y, -x), + 180 => (-x, -y), + 270 => (-y, x), + 360 => (x, y), + _ => panic!("Invalid rotate manouvre {}", amount), + } +} + #[derive(Default)] pub struct Day12; impl Solution for Day12 { - fn part1(&mut self, _input: &mut dyn Read) -> String { - todo!() + fn part1(&mut self, input: &mut dyn Read) -> String { + let mut x = 0; + let mut y = 0; + let mut v = (1, 0); + + for line in Lines::new(input) { + let dir = &line[0..1]; + let amount: i32 = line[1..].parse().unwrap(); + + match dir { + "N" => y += amount, + "E" => x += amount, + "S" => y -= amount, + "W" => x -= amount, + "F" => { + let (dx, dy) = v; + + x += amount * dx; + y += amount * dy; + } + "R" => v = rotate(amount, v), + "L" => v = rotate(360 - amount, v), + _ => panic!("Invalid direction '{}'", dir), + }; + } + + (x.abs() + y.abs()).to_string() + } + + fn part2(&mut self, input: &mut dyn Read) -> String { + let mut x = 0; + let mut y = 0; + let mut wx = 10; + let mut wy = 1; + + for line in Lines::new(input) { + let dir = &line[0..1]; + let amount: i32 = line[1..].parse().unwrap(); + + match dir { + "N" => wy += amount, + "E" => wx += amount, + "S" => wy -= amount, + "W" => wx -= amount, + "F" => { + x += wx * amount; + y += wy * amount; + } + "R" => { + let v = rotate(amount, (wx, wy)); + wx = v.0; + wy = v.1; + } + "L" => { + let v = rotate(360 - amount, (wx, wy)); + wx = v.0; + wy = v.1; + } + _ => panic!("Invalid direction '{}'", dir), + }; + } + + (x.abs() + y.abs()).to_string() + } +} + +#[cfg(test)] +mod tests { + use crate::test_implementation; + + use super::*; + + const SAMPLE: &[u8] = include_bytes!("../samples/12.txt"); + + #[test] + fn sample_part1() { + test_implementation!(Day12, 1, SAMPLE, 25); + } + + #[test] + fn sample_part2() { + test_implementation!(Day12, 2, SAMPLE, 286); } }