From b397d625c8e8539b6d41dd4524f85ad0a5eebc97 Mon Sep 17 00:00:00 2001 From: LeMoonStar Date: Mon, 2 Dec 2024 07:26:48 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20Day=202:=20Failed=20attempt=20at?= =?UTF-8?q?=20solving=20part=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/days/d02.rs | 83 +++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/src/days/d02.rs b/src/days/d02.rs index 91d4497..1bc1dff 100644 --- a/src/days/d02.rs +++ b/src/days/d02.rs @@ -11,60 +11,52 @@ pub enum Direction { pub struct Report(Vec); impl Report { - pub fn is_safe(&self, tolerance: usize) -> bool { + pub fn is_safe(&self, mut tolerance: usize) -> bool { let mut direction = None; - let mut failures = 0; - let mut skip_last = false; + let mut skip = false; for i in 1..self.0.len() { - match ( - self.0[i] - - self.0[i - if skip_last { - skip_last = false; - 2 - } else { - 1 - }], - &direction, - ) { - /* Over limits */ - (..=-4 | 4.., _) => { - failures += 1; - skip_last = true; - } - - /* Decide on direction */ - (..=-1, None) => direction = Some(Direction::Decreasing), - (1.., None) => direction = Some(Direction::Increasing), - - /* Wrong Direction */ - (1.., Some(Direction::Decreasing)) => { - failures += 1; - skip_last = true; - } - (..=-1, Some(Direction::Increasing)) => { - failures += 1; - skip_last = true; - } - - /* No Change */ - (0, _) => { - failures += 1; - skip_last = true; - } - _ => {} + if skip { + skip = false; + continue; } - if failures > tolerance { + if !Self::safe_comparison(self.0[i - 1], self.0[i], &mut direction) { + if tolerance > 0 && i > 1 { + tolerance -= 1; + if !Self::safe_comparison(self.0[i - 2], self.0[i], &mut direction) { + skip = true; + continue; + } + } + return false; } - - if skip_last { - println!("SKIPPING {}", i); - } } + true } + + fn safe_comparison(a: i8, b: i8, direction: &mut Option) -> bool { + match (b - a, &direction) { + /* Over limits */ + (..=-4 | 4.., _) => return false, + + /* Decide on direction */ + (..=-1, None) => *direction = Some(Direction::Decreasing), + (1.., None) => *direction = Some(Direction::Increasing), + + /* Wrong Direction */ + (1.., Some(Direction::Decreasing)) => return false, + (..=-1, Some(Direction::Increasing)) => return false, + + /* No Change */ + (0, _) => return false, + _ => {} + } + + return true; + } } impl From<&str> for Report { @@ -95,7 +87,6 @@ impl DayImpl for Day { fn one(&self, data: &mut Data) -> Answer { let mut safe_count = 0; for report in data { - println!("{:?}", report); if report.is_safe(0) { safe_count += 1; } @@ -107,9 +98,7 @@ impl DayImpl for Day { fn two(&self, data: &mut Data) -> Answer { let mut safe_count = 0; for report in data { - println!("{:?}", report); if report.is_safe(1) { - println!("Safe!"); safe_count += 1; } }