diff options
-rw-r--r-- | 2024/02/rust/Cargo.lock | 7 | ||||
-rw-r--r-- | 2024/02/rust/Cargo.toml | 6 | ||||
-rw-r--r-- | 2024/02/rust/src/main.rs | 46 |
3 files changed, 59 insertions, 0 deletions
diff --git a/2024/02/rust/Cargo.lock b/2024/02/rust/Cargo.lock new file mode 100644 index 0000000..f3a3299 --- /dev/null +++ b/2024/02/rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aoc_2024-02" +version = "0.1.0" diff --git a/2024/02/rust/Cargo.toml b/2024/02/rust/Cargo.toml new file mode 100644 index 0000000..6030837 --- /dev/null +++ b/2024/02/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "aoc_2024-02" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/2024/02/rust/src/main.rs b/2024/02/rust/src/main.rs new file mode 100644 index 0000000..620fe8b --- /dev/null +++ b/2024/02/rust/src/main.rs @@ -0,0 +1,46 @@ +use std::io; + +fn main() { + let input: Vec<Vec<i64>> = io::stdin() + .lines() + .map(|line| { + line.unwrap() + .split_whitespace() + .map(str::parse::<i64>) + .collect() + }) + .collect::<Result<Vec<_>, _>>() + .unwrap(); + + let silver: usize = input.iter().map(self::safe).flatten().count(); + let gold: u64 = 0; + println!("silver: {silver}"); + println!("gold: {gold}"); +} + +#[derive(Debug, PartialEq)] +enum Dir { + Asc, + Desc, +} + +fn safe(xs: &Vec<i64>) -> Option<Dir> { + let mut dirs = xs + .iter() + .zip(xs.iter().skip(1)) + .map(|(x, y)| y - x) + .map(|d| match d { + -3..=-1 => Some(Dir::Desc), + 1..=3 => Some(Dir::Asc), + _ => None, + }) + .collect::<Option<Vec<Dir>>>()? + .into_iter(); + + let head = dirs.next().unwrap_or(Dir::Asc); + if dirs.all(|d| d == head) { + Some(head) + } else { + None + } +} |