Compare commits

..

No commits in common. '3042ce2a2b7bbe579f82ba3cce41d6af8b784704' and '81b51a85e7eaafb0b9b13e568bae99c3ef295123' have entirely different histories.

@ -105,7 +105,6 @@ impl Solver for Day1
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;
@ -113,8 +112,8 @@ impl Solver for Day1
let data_filename =
match self.data_set
{
DataSet::Test => format!("{}/data/day1_test_input", dir),
DataSet::Full => format!("{}/data/day1_input", dir),
DataSet::Test => format!("{}/data/test_input", dir),
DataSet::Full => format!("{}/data/input", dir),
};
@ -140,11 +139,6 @@ impl Solver for Day1
self.data_a.sort();
self.data_b.sort();
if self.data_a.len() != self.data_b.len()
{
panic!("Day 1 ERROR: Data set lengths do NOT match: data_a.len(): {}, data_b.len(): {}", self.data_a.len(), self.data_b.len());
}
if self.do_debug_prints
{
println!("Day1 Debug: Input data processed:\n\tdata_a: {:#?}\n\tdata_b: {:#?}", self.data_a, self.data_b);

@ -8,7 +8,7 @@
* @brief Advent of Code 2024 day 2 problems
******************************************************************************/
use crate::report::{Report, Status};
use crate::report::Report;
use ::solver_base::solver_base::{Solver, DataSet, RunMode};
use utils::utils;
@ -30,6 +30,20 @@ impl Day2
{
Day2 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, reports: vec![], final_result: 0 }
}
fn solve_first_case(self: &mut Self) -> String
{
// TODO: Day2::solve_first_case
self.final_result.to_string()
}
fn solve_second_case(self: &mut Self) -> String
{
// TODO: Day2::solve_second_case
self.final_result.to_string()
}
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@ -44,7 +58,6 @@ impl Solver for Day2
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;
@ -52,8 +65,8 @@ impl Solver for Day2
let data_filename =
match self.data_set
{
DataSet::Test => format!("{}/data/day2_test_input", dir),
DataSet::Full => format!("{}/data/day2_input", dir),
DataSet::Test => format!("{}/data/test_input", dir),
DataSet::Full => format!("{}/data/input", dir),
};
@ -65,15 +78,6 @@ impl Solver for Day2
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<i32> = vec![];
for value in r.split(" ")
{
@ -85,26 +89,25 @@ impl Solver for Day2
println!("Processed report: {:#?}", lvl_list);
}
let dampener = self.run_mode == RunMode::SecondCase;
self.reports.push(Report::new(lvl_list, dampener));
self.reports.push(Report::new(lvl_list));
}
}
fn solve(self: &mut Self) -> String
{
let mut num_safe = 0;
for report in &mut self.reports
match self.run_mode
{
if report.analyze(self.do_debug_prints) == Status::Safe
RunMode::FirstCase =>
{
num_safe += 1;
self.solve_first_case()
},
RunMode::SecondCase =>
{
self.solve_second_case()
}
}
self.final_result = num_safe;
self.final_result.to_string()
}
}

@ -13,109 +13,19 @@ pub struct Report
{
levels: Vec<i32>,
status: Status,
enable_dampener: bool,
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// IMPL Report
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
impl Report
{
pub fn new(lvls: Vec<i32>, enable_dampener: bool) -> Report
pub fn new(lvls: Vec<i32>) -> Report
{
Report { levels: lvls , status: Status::Unknown, enable_dampener }
Report { levels: lvls , status: Status::Unknown }
}
pub fn analyze(self: &mut Report, enable_debug_prints: bool) -> Status
pub fn analyze(self: &mut Report) -> Status
{
if self.enable_dampener
{
// Brute force the dampener thing
let mut i = 0;
let mut status = check_levels(&self.levels, enable_debug_prints);
while i < self.levels.len() && status == Status::Unsafe
{
let mut levels = self.levels.clone();
levels.remove(i);
status = check_levels(&levels, enable_debug_prints);
i += 1;
}
self.status = status;
}
else
{
self.status = check_levels(&self.levels, enable_debug_prints);
}
return self.status;
}
fn _try_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;
return true;
}
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// HELPERS
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// SAFTY RULES:
// The levels are either all increasing or all decreasing.
// Any two adjacent levels differ by at least one and at most three.
fn check_levels(levels: &Vec<i32>, enable_debug_prints: bool) -> Status
{
let mut prev_direction = 0;
let mut i = 0;
while i < levels.len() - 1 // Don't process the last level value
{
let diff = levels[i] - 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 enable_debug_prints
{
println!("Day 2 DEBUG: Report ({:#?}) is unsafe due to invalid value gap ({}): {} to {}", levels, diff, levels[i], levels[i + 1])
}
return Status::Unsafe;
}
// increase/decrease check
if 0 == prev_direction
{
prev_direction = this_direction
}
else
{
if prev_direction != this_direction
{
if enable_debug_prints
{
println!("Day 2 DEBUG: Report ({:#?}) is unsafe due to increase/decrease rule violation: {} to {}", levels, levels[i], levels[i + 1])
}
return Status::Unsafe;
}
}
i += 1;
// TODO: Report::analyze()
Status::Unknown
}
Status::Safe
}

@ -27,13 +27,8 @@ fn main()
// DAY 2
let mut day_2 = Day2::new();
day_2.init(DataSet::Full, RunMode::FirstCase, false);
day_2.init(DataSet::Full, RunMode::FirstCase, true);
let day2_result = day_2.solve();
println!("Day2 Part 1 Final Result: {}", day2_result);
let mut day_2 = Day2::new();
day_2.init(DataSet::Full, RunMode::SecondCase, false);
let day2_result = day_2.solve();
println!("Day2 Part 2 Final Result: {}", day2_result);
}

Loading…
Cancel
Save