#[derive(Copy, Clone, PartialEq, Debug)] pub enum Status { Safe, Unsafe, Unknown, } #[derive(Clone, Debug)] pub struct Report { levels: Vec, status: Status, enable_dampener: bool, dampen_count: i32, } impl Report { pub fn new(lvls: Vec, enable_dampener: bool) -> Report { Report { levels: lvls , status: Status::Unknown, enable_dampener, dampen_count: 0 } } // SAFTY RULES: // The levels are either all increasing or all decreasing. // Any two adjacent levels differ by at least one and at most three. pub fn analyze(self: &mut Report, enable_debug_prints: bool) -> Status { let mut prev_direction = 0; let mut i = 0; while i < self.levels.len() - 1 // Don't process the last level value { let diff = self.levels[i] - self.levels[i + 1]; let this_direction = if diff > 0 { 1 } else if diff < 0 { -1 } else { 0 }; // diff check let diff = diff.abs(); if diff > 3 || diff < 1 { if self.dampen_level(i + 1, enable_debug_prints) { i = 0; continue; } if enable_debug_prints { println!("Day 2 DEBUG: Report ({:#?}) is unsafe due to invalid value gap ({}): {} to {}", self.levels, diff, self.levels[i], self.levels[i + 1]) } self.status = Status::Unsafe; return self.status; } // increase/decrease check if 0 == prev_direction { prev_direction = this_direction } else { if prev_direction != this_direction { if self.dampen_level(i, enable_debug_prints) { i = 0; continue; } if enable_debug_prints { println!("Day 2 DEBUG: Report ({:#?}) is unsafe due to increase/decrease rule violation: {} to {}", self.levels, self.levels[i], self.levels[i + 1]) } self.status = Status::Unsafe; return self.status; } } i += 1; } self.status = Status::Safe; return self.status; } fn check_levels(self: &mut Report, enable_debug_prints: bool) -> Status { Status::Unknown } fn dampen_level(self: &mut Report, at: usize, do_debug_prints: bool) -> bool { if !self.enable_dampener { return false; } if do_debug_prints { println!("Day 2 DEBUG: Bad level detected in report ({:#?}), using dampener to remove level: {}", self.levels, self.levels[at]); } self.levels.remove(at); self.enable_dampener = false; self.dampen_count += 1; if self.dampen_count > 1 { panic!("Day 2 ERROR: Dampener used more than once! usage: {}", self.dampen_count); } return true; } }