From c9468ba13909ade24764bc8e206ea29e3fd32d27 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Thu, 2 Dec 2021 08:21:49 +0100 Subject: [PATCH] Implementation 2021 day 2 --- 2021/inputs/02.txt | 1000 +++++++++++++++++++++++++++++++++++++++ 2021/src/day02.rs | 89 +++- 2021/src/samples/02.txt | 6 + 3 files changed, 1091 insertions(+), 4 deletions(-) create mode 100644 2021/inputs/02.txt create mode 100644 2021/src/samples/02.txt diff --git a/2021/inputs/02.txt b/2021/inputs/02.txt new file mode 100644 index 0000000..d88c23f --- /dev/null +++ b/2021/inputs/02.txt @@ -0,0 +1,1000 @@ +forward 1 +down 6 +forward 8 +up 3 +down 1 +down 4 +down 7 +down 3 +down 6 +up 8 +down 3 +forward 8 +up 4 +forward 8 +up 5 +down 3 +up 2 +forward 3 +forward 1 +forward 1 +up 4 +down 6 +forward 5 +down 7 +down 1 +down 5 +down 6 +up 5 +down 2 +forward 7 +down 9 +forward 5 +up 6 +forward 2 +down 2 +down 2 +down 1 +forward 6 +forward 8 +up 5 +down 6 +down 7 +forward 5 +up 7 +down 9 +down 9 +down 3 +down 3 +forward 1 +down 2 +up 8 +down 1 +down 7 +down 4 +forward 6 +up 8 +up 8 +up 5 +up 4 +down 9 +forward 4 +down 3 +down 8 +up 8 +up 7 +down 3 +forward 2 +forward 3 +forward 4 +forward 9 +up 2 +forward 9 +up 5 +up 9 +down 9 +forward 2 +down 7 +down 2 +forward 7 +down 3 +down 9 +down 8 +up 3 +up 4 +down 8 +down 8 +up 7 +up 7 +up 2 +up 9 +up 6 +forward 7 +forward 9 +forward 1 +up 9 +down 2 +forward 9 +down 6 +forward 6 +down 5 +up 2 +forward 5 +forward 2 +down 6 +down 3 +forward 4 +up 9 +down 8 +down 1 +down 9 +down 2 +down 5 +forward 6 +forward 2 +forward 4 +down 5 +down 8 +forward 2 +forward 1 +forward 3 +forward 4 +up 4 +forward 7 +down 4 +up 1 +up 2 +down 5 +down 7 +up 3 +forward 6 +up 2 +down 1 +down 4 +down 3 +forward 8 +forward 4 +down 7 +up 8 +down 8 +down 1 +forward 9 +down 3 +forward 1 +down 2 +up 4 +down 4 +down 5 +up 3 +up 1 +up 2 +forward 7 +forward 4 +forward 3 +down 4 +forward 7 +forward 7 +forward 8 +forward 9 +down 7 +forward 9 +forward 8 +up 2 +up 9 +forward 3 +forward 1 +down 3 +forward 3 +up 7 +up 1 +forward 4 +down 1 +up 9 +up 2 +down 9 +forward 4 +forward 7 +down 2 +forward 7 +forward 6 +up 7 +forward 8 +up 7 +up 2 +down 8 +down 6 +down 6 +forward 7 +down 8 +down 1 +forward 3 +down 1 +down 9 +forward 5 +up 1 +forward 6 +up 8 +down 1 +forward 4 +forward 6 +up 4 +up 8 +forward 5 +forward 4 +forward 7 +down 2 +up 6 +forward 7 +forward 1 +forward 5 +down 6 +forward 3 +forward 4 +forward 2 +forward 8 +down 5 +forward 2 +up 3 +forward 2 +forward 4 +up 2 +down 5 +down 5 +forward 4 +forward 1 +down 1 +up 9 +forward 4 +forward 9 +up 4 +up 4 +forward 6 +down 6 +forward 6 +forward 7 +down 2 +forward 8 +forward 6 +down 4 +down 3 +down 5 +down 5 +up 2 +down 6 +up 5 +up 4 +down 8 +down 7 +down 9 +down 7 +forward 5 +up 5 +forward 4 +forward 8 +down 4 +up 4 +up 7 +forward 8 +up 4 +up 2 +forward 6 +up 3 +down 1 +forward 6 +forward 3 +up 2 +forward 2 +forward 8 +forward 8 +forward 2 +down 9 +down 4 +forward 8 +forward 9 +down 3 +forward 5 +up 7 +down 6 +up 2 +up 6 +up 8 +forward 7 +down 1 +up 7 +down 7 +forward 1 +forward 5 +forward 4 +down 8 +forward 4 +down 8 +forward 1 +down 7 +down 8 +forward 1 +forward 2 +down 3 +down 3 +up 4 +forward 7 +down 2 +forward 9 +up 8 +down 1 +forward 5 +forward 6 +forward 5 +forward 3 +down 6 +down 1 +up 4 +down 9 +forward 8 +up 2 +down 5 +forward 1 +up 2 +down 8 +down 9 +forward 6 +up 8 +down 5 +down 5 +down 7 +up 6 +up 4 +up 3 +up 7 +up 3 +down 5 +forward 9 +up 6 +down 1 +down 8 +down 8 +forward 9 +forward 3 +forward 7 +forward 3 +forward 1 +up 7 +down 3 +down 6 +forward 8 +up 5 +forward 6 +down 6 +forward 3 +down 1 +up 8 +forward 5 +forward 9 +up 1 +up 1 +forward 9 +up 1 +forward 4 +forward 1 +forward 7 +down 6 +up 1 +forward 4 +up 7 +down 2 +down 1 +forward 2 +up 4 +forward 3 +down 4 +up 7 +down 9 +down 9 +forward 8 +down 4 +up 7 +down 4 +forward 2 +up 7 +forward 2 +forward 4 +down 5 +forward 4 +down 6 +forward 9 +forward 1 +forward 5 +forward 7 +up 5 +down 9 +down 5 +down 5 +up 7 +forward 7 +forward 6 +up 7 +forward 8 +up 2 +forward 5 +down 9 +up 3 +down 5 +forward 4 +down 7 +up 8 +up 8 +down 3 +down 2 +down 7 +down 9 +forward 6 +forward 9 +forward 9 +forward 2 +down 2 +forward 4 +forward 7 +up 2 +up 5 +forward 8 +down 1 +down 1 +down 9 +down 2 +forward 1 +up 5 +forward 6 +down 1 +forward 8 +up 2 +up 4 +down 3 +forward 6 +forward 3 +down 4 +forward 9 +down 6 +down 9 +up 2 +down 4 +down 6 +forward 3 +up 4 +down 4 +up 9 +forward 4 +forward 9 +forward 2 +forward 8 +down 9 +up 5 +forward 8 +down 1 +forward 8 +up 1 +down 1 +forward 7 +up 6 +down 2 +up 1 +down 8 +down 4 +forward 3 +down 3 +forward 6 +forward 1 +forward 9 +down 5 +down 9 +down 6 +down 2 +forward 4 +down 6 +down 5 +up 3 +up 1 +down 8 +forward 7 +forward 5 +down 8 +down 4 +down 2 +forward 5 +forward 2 +forward 5 +down 5 +forward 7 +down 9 +down 1 +forward 2 +down 4 +down 1 +forward 6 +up 2 +up 6 +forward 7 +down 1 +up 5 +down 6 +forward 3 +up 3 +forward 5 +forward 5 +down 4 +forward 4 +down 8 +down 2 +up 3 +up 4 +down 9 +up 5 +down 6 +forward 6 +forward 6 +up 9 +up 2 +forward 3 +down 5 +down 9 +forward 2 +up 3 +forward 7 +forward 1 +up 9 +down 8 +up 9 +forward 4 +forward 4 +forward 8 +down 4 +down 2 +down 5 +down 7 +down 9 +up 2 +down 1 +forward 7 +down 4 +down 1 +forward 2 +down 3 +up 5 +up 1 +down 3 +down 4 +up 4 +down 7 +forward 6 +forward 3 +forward 4 +down 5 +up 3 +up 9 +forward 2 +down 8 +up 2 +down 7 +down 2 +up 3 +forward 5 +forward 7 +up 4 +down 3 +down 1 +forward 5 +forward 2 +up 3 +up 6 +forward 8 +down 5 +forward 5 +down 7 +down 5 +up 7 +down 8 +forward 5 +down 9 +up 5 +forward 8 +forward 6 +forward 7 +down 9 +up 9 +forward 3 +down 8 +forward 1 +forward 5 +forward 9 +down 9 +down 2 +down 6 +down 7 +forward 8 +down 6 +down 8 +up 8 +down 2 +forward 2 +up 5 +up 3 +down 1 +down 7 +down 6 +forward 4 +up 5 +forward 6 +up 8 +forward 3 +up 6 +forward 3 +down 5 +forward 8 +forward 8 +up 6 +forward 5 +down 4 +down 7 +down 5 +down 9 +forward 2 +forward 9 +down 9 +forward 8 +down 4 +forward 4 +forward 1 +down 8 +down 1 +down 9 +down 5 +forward 4 +up 6 +down 7 +down 1 +up 4 +down 4 +down 6 +down 4 +up 8 +down 2 +forward 1 +forward 4 +down 1 +down 1 +up 2 +forward 5 +up 5 +down 9 +forward 3 +down 3 +forward 6 +forward 4 +down 6 +forward 2 +up 7 +up 8 +up 2 +up 8 +up 8 +down 8 +forward 4 +down 1 +forward 2 +forward 9 +up 3 +down 2 +down 1 +up 4 +down 9 +down 6 +forward 9 +down 6 +down 8 +down 9 +forward 2 +up 7 +forward 1 +down 8 +down 7 +down 8 +up 3 +forward 3 +up 7 +forward 7 +down 9 +down 3 +down 2 +down 5 +forward 9 +up 1 +down 7 +forward 5 +forward 4 +forward 8 +up 6 +down 7 +forward 5 +up 5 +down 1 +forward 4 +forward 9 +down 2 +forward 8 +up 9 +down 8 +forward 8 +up 6 +forward 3 +forward 1 +up 5 +down 6 +forward 8 +up 7 +down 1 +down 7 +down 3 +forward 7 +down 9 +down 5 +down 2 +forward 2 +down 4 +down 1 +forward 8 +down 4 +up 1 +forward 4 +down 7 +forward 6 +down 5 +up 8 +forward 1 +forward 2 +up 5 +down 7 +forward 6 +down 7 +forward 6 +down 8 +down 2 +up 3 +down 6 +forward 1 +down 5 +down 8 +down 2 +forward 6 +up 4 +forward 4 +down 1 +forward 9 +forward 8 +forward 4 +forward 9 +down 8 +down 8 +up 1 +up 3 +down 8 +down 4 +forward 4 +down 6 +up 7 +down 8 +down 3 +down 2 +down 7 +down 5 +down 7 +forward 3 +down 6 +forward 6 +down 1 +forward 7 +down 9 +forward 2 +down 7 +forward 1 +up 9 +down 5 +up 6 +down 2 +up 4 +forward 5 +forward 2 +forward 6 +down 2 +forward 5 +down 3 +forward 6 +up 7 +up 5 +up 3 +up 5 +up 4 +down 8 +up 8 +forward 3 +down 2 +down 1 +forward 2 +down 8 +down 8 +down 1 +up 7 +down 1 +forward 6 +down 5 +forward 7 +up 3 +up 4 +forward 9 +down 3 +down 1 +down 6 +forward 1 +forward 6 +forward 2 +forward 5 +down 7 +down 5 +down 2 +forward 6 +down 7 +forward 2 +down 4 +down 8 +forward 2 +forward 2 +up 5 +forward 5 +down 5 +down 4 +up 7 +down 3 +forward 2 +down 7 +forward 2 +forward 5 +down 8 +up 3 +forward 4 +forward 4 +down 2 +down 9 +down 5 +forward 2 +forward 7 +down 7 +down 1 +down 5 +down 1 +down 4 +down 9 +down 2 +forward 9 +forward 8 +down 4 +forward 9 +down 9 +down 7 +down 6 +down 2 +forward 5 +down 4 +up 3 +forward 2 +up 5 +forward 7 +up 6 +forward 3 +forward 1 +forward 3 +down 7 +forward 8 +down 1 +forward 1 +forward 5 +forward 5 +up 4 +down 7 +down 8 +forward 4 +down 6 +forward 1 +forward 7 +down 5 +down 9 +forward 2 +down 3 +down 5 +forward 4 +forward 5 +forward 1 +down 1 +down 6 +down 9 +forward 1 +forward 1 +up 5 +forward 3 +up 3 +up 5 +down 2 +forward 6 +forward 3 +down 4 +up 3 +down 8 +down 4 +up 3 +down 7 +forward 7 +up 3 +down 3 +down 8 +down 4 +down 5 +down 3 +up 1 +forward 4 +forward 1 +down 5 +up 8 +up 9 +forward 1 +up 8 +down 3 +forward 8 +up 4 +forward 5 +forward 5 +up 1 +down 6 +down 2 +up 3 +up 7 +forward 7 +down 7 +up 9 +forward 2 +forward 8 +forward 2 +up 7 +forward 3 +down 8 +down 7 +forward 6 +down 9 +forward 4 +forward 9 +forward 2 +down 2 +down 6 +down 8 +forward 6 +down 5 +forward 7 +up 8 +down 6 +forward 5 +down 6 +forward 1 +forward 5 +forward 1 +up 9 +forward 3 +down 9 +down 7 +forward 3 +up 6 +down 9 +down 6 +down 9 +forward 3 +forward 5 +up 3 +up 9 +down 1 +down 8 +down 4 +forward 6 +down 9 +forward 4 +forward 3 +down 8 +forward 5 +forward 6 +forward 5 +forward 1 +forward 7 +forward 8 +down 4 +forward 9 +up 3 +down 3 +forward 6 +down 2 +forward 7 +down 2 +forward 8 +forward 3 diff --git a/2021/src/day02.rs b/2021/src/day02.rs index 113ba49..1e29efb 100644 --- a/2021/src/day02.rs +++ b/2021/src/day02.rs @@ -1,9 +1,90 @@ +use std::io::BufRead; +use std::io::BufReader; use std::io::Read; -pub fn part1(_input: &mut dyn Read) -> String { - todo!() +enum Dir { + Up, + Down, + Forward, } -pub fn part2(_input: &mut dyn Read) -> String { - todo!() +fn parse_input(input: &mut dyn Read) -> Vec<(Dir, i32)> { + let mut reader = BufReader::new(input); + let mut buffer = String::new(); + + let mut moves = Vec::new(); + + while matches!(reader.read_line(&mut buffer), Ok(n) if n > 0) { + let (dir, amount) = buffer.trim().split_once(" ").unwrap(); + + let dir = match dir { + "up" => Dir::Up, + "down" => Dir::Down, + "forward" => Dir::Forward, + _ => panic!("Invalid direction '{}'", dir), + }; + + moves.push((dir, amount.parse().unwrap())); + + buffer.clear(); + } + + moves +} + +pub fn part1(input: &mut dyn Read) -> String { + let moves = parse_input(input); + + let mut x = 0; + let mut depth = 0; + + for (dir, amount) in moves { + match dir { + Dir::Up => depth -= amount, + Dir::Down => depth += amount, + Dir::Forward => x += amount, + } + } + + (x * depth).to_string() +} + +pub fn part2(input: &mut dyn Read) -> String { + let moves = parse_input(input); + + let mut x = 0; + let mut depth = 0; + let mut aim = 0; + + for (dir, amount) in moves { + match dir { + Dir::Up => aim -= amount, + Dir::Down => aim += amount, + Dir::Forward => { + x += amount; + depth += aim * amount; + } + } + } + + (x * depth).to_string() +} + +#[cfg(test)] +mod tests { + use crate::test_implementation; + + use super::*; + + const SAMPLE: &[u8] = include_bytes!("samples/02.txt"); + + #[test] + fn sample_part1() { + test_implementation(part1, SAMPLE, 150); + } + + #[test] + fn sample_part2() { + test_implementation(part1, SAMPLE, 150); + } } diff --git a/2021/src/samples/02.txt b/2021/src/samples/02.txt new file mode 100644 index 0000000..b7172ac --- /dev/null +++ b/2021/src/samples/02.txt @@ -0,0 +1,6 @@ +forward 5 +down 5 +forward 8 +up 3 +down 8 +forward 2