From 2ecc65bab8292a8cd27fedf36d07e0d86f929a99 Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Thu, 2 Dec 2021 11:00:54 +0100 Subject: day2 --- inputs/day2 | 1000 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/bin/day2.rs | 102 ++++++ src/lib.rs | 10 +- 3 files changed, 1110 insertions(+), 2 deletions(-) create mode 100644 inputs/day2 create mode 100644 src/bin/day2.rs diff --git a/inputs/day2 b/inputs/day2 new file mode 100644 index 0000000..e48215f --- /dev/null +++ b/inputs/day2 @@ -0,0 +1,1000 @@ +forward 1 +forward 5 +forward 8 +down 9 +down 7 +forward 2 +up 3 +forward 7 +down 1 +down 7 +down 9 +up 2 +up 9 +down 5 +up 7 +forward 6 +down 7 +forward 9 +down 2 +down 5 +forward 5 +down 5 +forward 4 +up 3 +up 2 +down 8 +down 7 +forward 1 +forward 5 +forward 2 +down 8 +forward 3 +down 8 +down 2 +down 1 +forward 7 +down 2 +forward 1 +forward 4 +forward 8 +forward 4 +forward 6 +forward 7 +forward 4 +down 3 +down 3 +down 1 +down 4 +forward 1 +up 5 +down 8 +forward 9 +up 4 +forward 2 +up 5 +forward 7 +forward 9 +up 5 +forward 5 +down 5 +forward 8 +up 6 +up 7 +up 4 +down 4 +up 5 +up 9 +forward 3 +down 9 +down 4 +up 5 +forward 3 +forward 8 +up 4 +down 2 +down 7 +down 2 +down 7 +down 5 +down 7 +down 2 +forward 9 +forward 7 +up 5 +forward 8 +forward 7 +up 5 +forward 6 +up 5 +down 3 +down 9 +up 2 +forward 4 +down 4 +down 3 +forward 4 +down 4 +forward 5 +down 6 +forward 5 +down 4 +down 2 +down 4 +up 8 +up 3 +down 8 +forward 2 +forward 9 +down 5 +down 8 +down 3 +down 2 +up 2 +up 1 +forward 7 +up 3 +down 7 +up 2 +forward 7 +down 2 +forward 9 +down 3 +forward 1 +down 6 +up 1 +forward 8 +down 2 +down 1 +down 1 +up 6 +forward 5 +forward 8 +forward 2 +down 8 +down 2 +forward 6 +down 3 +down 2 +forward 7 +down 6 +down 9 +down 3 +forward 2 +down 8 +forward 2 +up 1 +down 7 +forward 9 +down 9 +forward 1 +down 4 +down 7 +forward 1 +up 4 +down 5 +down 4 +down 3 +up 8 +down 1 +down 8 +up 1 +up 7 +forward 4 +forward 1 +down 4 +forward 7 +down 3 +forward 6 +down 9 +down 6 +down 4 +up 6 +forward 8 +down 5 +forward 9 +down 6 +down 4 +forward 1 +down 6 +down 7 +up 9 +up 4 +up 2 +forward 4 +up 4 +down 9 +down 2 +up 6 +forward 9 +down 5 +down 2 +forward 3 +up 2 +forward 2 +down 4 +forward 3 +up 8 +down 2 +forward 7 +forward 3 +down 9 +forward 6 +down 1 +forward 7 +forward 6 +up 6 +forward 3 +forward 2 +forward 5 +up 5 +down 5 +down 2 +down 9 +down 7 +forward 3 +forward 6 +forward 6 +forward 5 +down 2 +forward 4 +forward 8 +forward 2 +forward 1 +up 4 +up 6 +down 6 +forward 5 +forward 5 +down 6 +down 8 +forward 7 +forward 1 +down 9 +up 8 +down 9 +down 1 +up 4 +down 9 +up 6 +down 5 +forward 4 +forward 2 +down 9 +down 8 +up 6 +down 3 +down 7 +up 5 +forward 6 +down 3 +forward 4 +up 7 +down 8 +forward 3 +down 9 +down 7 +forward 5 +forward 2 +forward 4 +forward 8 +down 2 +forward 6 +forward 9 +down 9 +forward 6 +down 2 +down 8 +up 7 +down 4 +forward 2 +forward 6 +forward 2 +forward 7 +forward 1 +up 1 +up 1 +down 9 +forward 9 +down 7 +up 4 +forward 8 +up 7 +down 3 +forward 3 +forward 7 +down 2 +up 3 +forward 5 +down 5 +forward 1 +down 8 +forward 9 +forward 5 +down 9 +forward 8 +down 3 +up 7 +down 1 +forward 6 +forward 3 +forward 8 +down 3 +down 6 +forward 9 +forward 5 +down 3 +up 7 +forward 2 +forward 6 +up 2 +forward 3 +down 4 +up 8 +down 7 +up 3 +down 2 +down 3 +up 9 +down 2 +forward 7 +up 7 +forward 1 +down 2 +forward 4 +forward 9 +down 6 +forward 5 +forward 1 +down 6 +down 1 +up 8 +up 5 +down 9 +up 4 +forward 4 +down 9 +forward 7 +down 7 +forward 4 +up 3 +down 7 +down 6 +forward 3 +up 5 +down 9 +down 3 +forward 5 +forward 6 +down 7 +up 3 +up 4 +forward 9 +forward 1 +down 1 +down 1 +up 8 +down 2 +down 4 +down 2 +up 4 +down 1 +forward 9 +down 2 +up 3 +up 1 +up 2 +forward 4 +down 2 +forward 7 +forward 7 +down 4 +forward 3 +down 6 +down 8 +forward 5 +down 9 +forward 9 +down 3 +forward 4 +down 6 +down 9 +down 1 +down 5 +down 4 +down 5 +forward 5 +forward 6 +forward 8 +forward 1 +forward 2 +down 8 +down 4 +down 5 +down 2 +up 4 +down 3 +forward 1 +up 9 +down 8 +forward 9 +up 2 +down 9 +forward 6 +up 5 +forward 3 +forward 4 +down 5 +down 7 +down 1 +forward 6 +down 4 +forward 7 +down 3 +up 3 +forward 5 +down 3 +down 1 +down 6 +up 1 +forward 6 +down 2 +down 3 +down 4 +forward 6 +down 1 +forward 3 +down 8 +down 3 +forward 9 +forward 3 +down 6 +up 7 +forward 4 +down 6 +down 9 +forward 6 +down 3 +up 4 +down 8 +forward 7 +up 7 +forward 1 +forward 6 +down 6 +up 4 +down 6 +forward 4 +forward 5 +down 9 +forward 6 +forward 7 +up 3 +forward 7 +forward 6 +forward 8 +down 8 +forward 6 +down 5 +forward 2 +down 1 +forward 9 +down 8 +up 9 +down 1 +forward 6 +down 7 +up 7 +up 3 +down 8 +up 1 +down 9 +down 4 +forward 6 +down 6 +up 2 +up 4 +down 5 +up 2 +forward 2 +down 5 +forward 6 +down 9 +up 8 +down 1 +down 6 +down 2 +up 8 +up 9 +down 6 +forward 2 +down 8 +up 3 +forward 3 +down 9 +forward 5 +forward 3 +forward 8 +up 7 +down 2 +up 5 +down 1 +down 5 +down 9 +forward 6 +up 8 +forward 3 +forward 1 +forward 1 +forward 6 +down 2 +forward 3 +down 3 +forward 8 +forward 4 +up 1 +forward 7 +up 3 +up 6 +forward 9 +up 7 +down 1 +down 1 +down 7 +down 6 +down 6 +up 6 +forward 3 +up 4 +forward 3 +down 6 +down 1 +forward 7 +down 7 +forward 8 +down 5 +down 6 +forward 4 +up 2 +forward 5 +forward 4 +up 5 +down 4 +forward 9 +up 7 +forward 5 +down 7 +down 4 +down 3 +down 4 +down 3 +forward 3 +forward 6 +up 3 +down 9 +up 9 +down 9 +down 8 +forward 7 +forward 1 +up 4 +up 2 +down 5 +forward 6 +down 1 +forward 6 +forward 6 +down 3 +down 1 +forward 9 +forward 7 +up 4 +forward 2 +up 9 +forward 2 +down 5 +down 9 +down 8 +up 2 +down 5 +down 3 +forward 6 +down 4 +up 2 +up 9 +down 4 +forward 4 +up 6 +up 4 +forward 6 +up 1 +forward 9 +up 1 +down 8 +forward 2 +up 5 +up 6 +forward 4 +down 8 +forward 1 +forward 5 +forward 5 +forward 8 +down 3 +down 3 +forward 3 +down 4 +forward 5 +down 2 +forward 1 +down 3 +down 7 +down 1 +down 5 +forward 8 +down 2 +down 3 +up 9 +forward 5 +down 3 +down 8 +down 1 +up 1 +down 2 +up 4 +forward 7 +down 6 +down 9 +down 4 +forward 4 +forward 2 +forward 6 +forward 3 +forward 6 +forward 5 +down 4 +forward 4 +forward 2 +down 3 +up 3 +down 3 +forward 4 +down 3 +up 5 +up 8 +down 5 +forward 2 +forward 7 +up 5 +forward 7 +down 1 +forward 8 +down 2 +down 1 +forward 5 +down 6 +forward 4 +forward 8 +forward 1 +down 9 +down 3 +down 6 +down 5 +down 7 +forward 8 +forward 4 +down 5 +down 3 +down 9 +down 2 +forward 1 +forward 9 +up 2 +forward 3 +down 4 +forward 8 +down 2 +up 6 +up 2 +down 2 +up 7 +down 3 +down 7 +forward 9 +forward 2 +up 2 +forward 6 +down 8 +down 9 +down 8 +down 8 +down 1 +down 3 +up 9 +up 9 +forward 9 +forward 4 +down 4 +down 2 +forward 5 +forward 4 +forward 1 +forward 2 +forward 2 +down 2 +forward 8 +down 6 +forward 7 +forward 4 +down 7 +down 2 +up 2 +down 7 +forward 7 +up 3 +forward 3 +down 3 +forward 5 +forward 2 +down 1 +forward 1 +forward 8 +down 1 +down 9 +down 8 +down 8 +down 7 +down 2 +forward 2 +down 6 +down 2 +up 7 +down 1 +up 6 +forward 5 +down 9 +forward 9 +forward 4 +forward 4 +down 6 +up 3 +forward 5 +forward 6 +down 5 +up 8 +down 1 +down 3 +up 5 +down 2 +down 5 +forward 5 +down 2 +up 9 +forward 3 +up 9 +forward 6 +up 7 +forward 9 +down 8 +up 8 +down 4 +forward 3 +forward 8 +down 5 +down 7 +down 6 +down 4 +up 3 +forward 8 +down 4 +down 7 +up 9 +up 5 +down 6 +up 1 +down 9 +up 4 +down 6 +down 7 +up 4 +forward 5 +up 8 +down 9 +forward 9 +forward 8 +down 7 +up 9 +down 3 +down 2 +down 1 +down 6 +up 3 +up 2 +down 9 +forward 4 +forward 8 +up 7 +forward 1 +down 4 +down 7 +up 5 +forward 9 +forward 2 +down 7 +up 2 +forward 6 +forward 4 +forward 7 +down 7 +down 4 +forward 9 +forward 9 +down 3 +down 4 +up 1 +forward 1 +down 3 +down 5 +down 2 +down 8 +down 5 +forward 4 +forward 7 +forward 7 +down 3 +up 4 +up 3 +forward 2 +forward 8 +forward 1 +up 5 +down 2 +down 1 +forward 7 +forward 7 +forward 4 +forward 8 +down 4 +forward 7 +down 8 +down 4 +forward 3 +forward 9 +forward 6 +forward 6 +forward 6 +down 1 +down 8 +forward 2 +forward 6 +forward 8 +down 1 +forward 9 +forward 5 +forward 6 +down 2 +forward 8 +down 1 +forward 7 +down 7 +down 1 +up 4 +up 3 +forward 6 +forward 2 +forward 8 +forward 2 +down 4 +forward 6 +down 1 +forward 7 +up 5 +forward 4 +forward 3 +forward 6 +down 6 +down 4 +forward 6 +down 7 +down 9 +down 1 +up 5 +up 7 +down 4 +forward 1 +down 4 +up 1 +down 4 +down 1 +up 6 +forward 2 +down 2 +down 5 +down 8 +down 2 +down 9 +down 5 +forward 3 +up 6 +forward 9 +down 7 +up 7 +down 7 +up 7 +up 4 +down 6 +up 5 +down 3 +forward 9 +forward 4 +down 2 +down 1 +up 1 +down 7 +down 7 +forward 7 +down 2 +up 1 +forward 6 +down 3 +forward 5 +forward 3 +down 5 +forward 1 +down 8 +up 2 +forward 9 +down 2 +up 6 +down 7 +forward 1 +forward 2 +down 2 +up 5 +forward 2 +down 8 +forward 3 +up 2 +down 9 +down 6 +up 3 +down 4 +forward 8 +forward 3 +up 7 +down 4 +forward 4 +forward 5 +forward 3 +up 7 +forward 7 +forward 9 +down 4 +forward 3 +down 9 +down 3 +forward 3 +down 3 +forward 7 +up 6 +forward 9 +down 2 +down 8 +up 9 +forward 3 +forward 5 +down 9 +forward 6 +down 2 +up 9 +forward 6 +forward 3 +down 5 +forward 2 +up 1 +down 3 +up 1 +down 2 +down 6 +forward 5 +up 1 +down 2 +forward 1 +forward 5 +down 5 +forward 8 +down 5 +forward 4 +forward 7 +forward 3 +forward 5 +up 5 +forward 4 +down 1 +down 9 +up 8 +down 8 +down 1 +up 1 +down 7 +forward 3 diff --git a/src/bin/day2.rs b/src/bin/day2.rs new file mode 100644 index 0000000..066301f --- /dev/null +++ b/src/bin/day2.rs @@ -0,0 +1,102 @@ +struct Position { + x: i32, + y: i32, +} + +struct AimedPosition { + pos: Position, + aim: i32, +} + +fn main() { + let input = advent::read_lines(2); + + let pos = drive_course(Position {x: 0, y: 0}, &input); + println!("2a: {}", pos.x * pos.y); + + let pos = drive_course_aimed(Position {x: 0, y: 0}, &input); + println!("2b: {}", pos.x * pos.y); +} + +fn move_submarine(pos: Position, cmd: &str) -> Position { + let tokens : Vec<&str> = cmd.split(' ').collect(); + let direction = tokens[0]; + let distance = tokens[1].parse::().unwrap(); + + let mut pos = pos; + match direction { + "forward" => { + pos.x += distance; + }, + "down" => { + pos.y += distance; + }, + "up" => { + pos.y -= distance; + }, + _ => panic!("invalid direction: {}", direction) + }; + + pos +} + +fn move_submarine_aimed(pos: AimedPosition, cmd: &str) -> AimedPosition { + let tokens : Vec<&str> = cmd.split(' ').collect(); + let direction = tokens[0]; + let distance = tokens[1].parse::().unwrap(); + + let mut pos = pos; + match direction { + "forward" => { + pos.pos.x += distance; + pos.pos.y += pos.aim * distance; + }, + "down" => { + pos.aim += distance; + }, + "up" => { + pos.aim -= distance; + }, + _ => panic!("invalid direction: {}", direction) + }; + + pos +} + +fn drive_course>(start: Position, course: &[T]) -> Position { + let mut pos = start; + for cmd in course { + pos = move_submarine(pos, cmd.as_ref()); + } + pos +} + +fn drive_course_aimed>(start: Position, course: &[T]) -> Position { + let mut pos = AimedPosition { pos: start, aim: 0 }; + for cmd in course { + pos = move_submarine_aimed(pos, cmd.as_ref()); + } + pos.pos +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let course = [ + "forward 5", + "down 5", + "forward 8", + "up 3", + "down 8", + "forward 2", + ]; + let pos = drive_course(Position {x: 0, y: 0}, &course); + assert_eq!(pos.x * pos.y, 150); + + let pos = drive_course_aimed(Position {x: 0, y: 0}, &course); + assert_eq!(pos.x * pos.y, 900); + } +} diff --git a/src/lib.rs b/src/lib.rs index 6befee8..2f99150 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,9 +4,15 @@ pub fn read_file(day: u8) -> String { std::fs::read_to_string(filename).unwrap() } -pub fn read_numbers(day: u8) -> Vec { +pub fn read_lines(day: u8) -> Vec { read_file(day).split('\n') .filter(|n| !n.is_empty()) - .map(|n| n.parse::().unwrap()) + .map(String::from) .collect() } + +pub fn read_numbers(day: u8) -> Vec { + read_lines(day).iter() + .map(|n| n.parse::().unwrap()) + .collect() +} -- cgit v1.2.3