From 75419df5eb7ac81cbd8ac631ca71bbbdae18a10a Mon Sep 17 00:00:00 2001 From: mhsn Date: Tue, 29 Apr 2025 19:27:22 +0100 Subject: 2024-02 rust p2 --- 2024/02/rust/src/main.rs | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/2024/02/rust/src/main.rs b/2024/02/rust/src/main.rs index 620fe8b..2007837 100644 --- a/2024/02/rust/src/main.rs +++ b/2024/02/rust/src/main.rs @@ -1,3 +1,5 @@ +#![feature(iter_map_windows)] + use std::io; fn main() { @@ -12,35 +14,20 @@ fn main() { .collect::, _>>() .unwrap(); - let silver: usize = input.iter().map(self::safe).flatten().count(); - let gold: u64 = 0; + let silver: usize = input.iter().filter(|&xs| all_safe(xs)).count(); + let gold: usize = input.iter().filter(|&xs| drop_safe(xs)).count(); println!("silver: {silver}"); println!("gold: {gold}"); } -#[derive(Debug, PartialEq)] -enum Dir { - Asc, - Desc, +fn all_safe(xs: &Vec) -> bool { + let mut diffs = xs.iter().map_windows(|&[x, y]| y - x).peekable(); + let dir = diffs.peek().unwrap_or(&1).signum(); + diffs.all(|d| (1..=3).contains(&d.abs()) && d.signum() == dir) } -fn safe(xs: &Vec) -> Option { - 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::>>()? - .into_iter(); - - let head = dirs.next().unwrap_or(Dir::Asc); - if dirs.all(|d| d == head) { - Some(head) - } else { - None - } +fn drop_safe(xs: &Vec) -> bool { + (0..xs.len()) + .map(|idx| xs.split_at(idx)) + .any(|(left, right)| all_safe(&[left, &right[1..]].concat())) } -- cgit v1.2.3