/****************************************************************************** * @file day_2.rs * @author Joey Pollack * @date 2024/12/03 (y/m/d) * @modified 2024/12/03 (y/m/d) * @copyright Joseph R Pollack * @brief Advent of Code 2024 day 2 problems ******************************************************************************/ use crate::report::{Report, Status}; use ::solver_base::solver_base::{Solver, DataSet, RunMode}; use utils::utils; pub struct Day2 { data_set: DataSet, run_mode: RunMode, do_debug_prints: bool, reports: Vec, pub final_result: i32, } //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // DAY 2 IMPL //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| impl Day2 { pub fn new() -> Day2 { Day2 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, reports: vec![], final_result: 0 } } } //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // SOLVER TRAIT IMPL //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| impl Solver for Day2 { fn print_test() { println!("DAY 2 TEST PRINT"); } fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool) { self.data_set = data_set; self.run_mode = run_mode; self.do_debug_prints = enable_debug_prints; let dir = utils::get_working_dir(); let data_filename = match self.data_set { DataSet::Test => format!("{}/data/day2_test_input", dir), DataSet::Full => format!("{}/data/day2_input", dir), }; let data = utils::load_data(&data_filename); for r in data.split("\n") { if self.do_debug_prints { println!("Raw report: {}", r); } if r.is_empty() { if self.do_debug_prints { println!("Day 2 DEBUG: Report is empty, discarding..."); } continue; } let mut lvl_list: Vec = vec![]; for value in r.split(" ") { lvl_list.push(value.parse::().unwrap()); } if self.do_debug_prints { println!("Processed report: {:#?}", lvl_list); } let dampener = self.run_mode == RunMode::SecondCase; self.reports.push(Report::new(lvl_list, dampener)); } } fn solve(self: &mut Self) -> String { let mut num_safe = 0; for report in &mut self.reports { if report.analyze(self.do_debug_prints) == Status::Safe { num_safe += 1; } } self.final_result = num_safe; self.final_result.to_string() } }