From 161e5f7a5f5b1f7029854280bd688783ef1a8ede Mon Sep 17 00:00:00 2001 From: Joseph Montanaro Date: Fri, 3 Dec 2021 10:34:31 -0800 Subject: [PATCH] add day 2 --- 2021/src/day2.rs | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ 2021/src/lib.rs | 9 +++++- 2021/src/main.rs | 13 ++++---- 3 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 2021/src/day2.rs diff --git a/2021/src/day2.rs b/2021/src/day2.rs new file mode 100644 index 0000000..fb4746d --- /dev/null +++ b/2021/src/day2.rs @@ -0,0 +1,78 @@ +use std::str::FromStr; + +use color_eyre::eyre; +use eyre::{eyre, ensure}; + +use crate::lib::ParseLines; + + +enum Direction { + Forward, + Up, + Down, +} + + +struct MoveCmd { + dir: Direction, + value: i32, +} + + +impl<'a> FromStr for MoveCmd { + type Err = eyre::Report; + + fn from_str(s: &str) -> Result { + let parts: Vec<&str> = s.split_whitespace().collect(); + ensure!(parts.len() == 2, "Could not parse: \"{}\" (Wrong number of words)", s); + + let dir = match parts[0] { + "forward" => Direction::Forward, + "up" => Direction::Up, + "down" => Direction::Down, + _ => return Err(eyre!("Could not parse: \"{}\" (invalid axis)", s)), + }; + + let value = parts[1].parse::()?; + + Ok(MoveCmd{dir, value}) + } +} + + +pub fn part1(data: &str) -> eyre::Result<()> { + let mut horiz = 0; // how many units forward + let mut vert = 0; // how many units DOWN (so flipped) + for res in data.parse_lines::() { + let cmd = res?; + match cmd.dir { + Direction::Forward => horiz += cmd.value, + Direction::Up => vert -= cmd.value, + Direction::Down => vert += cmd.value, + } + } + + println!("One: {}", horiz * vert); + Ok(()) +} + + +pub fn part2(data: &str) -> eyre::Result<()> { + let mut horiz = 0; + let mut vert = 0; + let mut aim = 0; + for res in data.parse_lines::() { + let cmd = res?; + match cmd.dir { + Direction::Down => aim += cmd.value, // flipped again + Direction::Up => aim -= cmd.value, + Direction::Forward => { + horiz += cmd.value; + vert += cmd.value * aim; + } + } + } + + println!("Two: {}", horiz * vert); + Ok(()) +} diff --git a/2021/src/lib.rs b/2021/src/lib.rs index dbe3b59..1da8eda 100644 --- a/2021/src/lib.rs +++ b/2021/src/lib.rs @@ -36,7 +36,7 @@ pub trait ParseLines { } -impl ParseLines for String { +impl ParseLines for str { fn parse_lines(&self) -> LineParser<'_, T> { LineParser { it: self.lines(), @@ -45,3 +45,10 @@ impl ParseLines for String { } } + +impl ParseLines for String { + fn parse_lines(&self) -> LineParser<'_, T> { + self[..].parse_lines::() + } +} + diff --git a/2021/src/main.rs b/2021/src/main.rs index 6a867a9..6f956e7 100644 --- a/2021/src/main.rs +++ b/2021/src/main.rs @@ -3,13 +3,19 @@ use color_eyre::eyre; mod lib; use lib::{load, ParseLines}; +mod day2; + + fn main() -> eyre::Result<()> { - day_one() + let data = load("data/02.txt")?; + day2::part1(&data)?; + day2::part2(&data) } +#[allow(dead_code)] fn day_one() -> eyre::Result<()> { let data = load("data/01.txt")?; @@ -38,8 +44,3 @@ fn day_one() -> eyre::Result<()> { println!("Two: {}", window_increases); Ok(()) } - - -// fn day_two() -> eyre::Result<()> { - -// }