diff --git a/2024/day-2/src/part1.rs b/2024/day-2/src/part1.rs index 65a198a..17914a5 100644 --- a/2024/day-2/src/part1.rs +++ b/2024/day-2/src/part1.rs @@ -1,6 +1,7 @@ #![warn(clippy::all, clippy::pedantic)] use error_stack::{Report, Result, ResultExt}; +use itertools::Itertools; use nom::{character::complete, multi::separated_list1, IResult}; use std::cmp::Ordering; use thiserror::Error; @@ -19,11 +20,11 @@ struct XmasReport { impl XmasReport { pub fn is_safe(&self) -> Safety { let mut dir = Ordering::Equal; - for i in 1..self.levels.len() { - if !(1_u32..=3).contains(&(self.levels[i - 1].abs_diff(self.levels[i]))) { + for (a, b) in self.levels.iter().tuple_windows(){ + if !(1_u32..=3).contains(&(a.abs_diff(*b))) { return Safety::UnSafe; } - let new_dir = self.levels[i - 1].cmp(&self.levels[i]); + let new_dir = a.cmp(b); if dir != Ordering::Equal && dir != new_dir { return Safety::UnSafe; } diff --git a/2024/day-2/src/part2.rs b/2024/day-2/src/part2.rs index 35774f2..3b19b6d 100644 --- a/2024/day-2/src/part2.rs +++ b/2024/day-2/src/part2.rs @@ -1,6 +1,7 @@ #![warn(clippy::all, clippy::pedantic)] use error_stack::{Report, Result, ResultExt}; +use itertools::Itertools; use nom::{character::complete, multi::separated_list1, IResult}; use std::cmp::Ordering; use thiserror::Error; @@ -20,11 +21,11 @@ impl XmasReport { pub fn is_safe(&self) -> Safety { fn internal_check(levels: &[u32]) -> Safety { let mut dir = Ordering::Equal; - for i in 1..levels.len() { - if !(1_u32..=3).contains(&(levels[i - 1].abs_diff(levels[i]))) { + for (a, b) in levels.iter().tuple_windows() { + if !(1_u32..=3).contains(&(a.abs_diff(*b))) { return Safety::UnSafe; } - let new_dir = levels[i - 1].cmp(&levels[i]); + let new_dir = a.cmp(b); if dir != Ordering::Equal && dir != new_dir { return Safety::UnSafe; }