Compare commits

...

2 Commits

Author SHA1 Message Date
Joey Pollack 1f6d97bcc8 Adds verbose print option to the solver 1 year ago
Joey Pollack 7f4dd970d5 day 6 complete 1 year ago

@ -16,6 +16,8 @@ pub struct Day1
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
do_verbose_prints: bool,
data_a: Vec<i32>,
data_b: Vec<i32>,
distances: Vec<i32>,
@ -29,7 +31,16 @@ impl Day1
{
pub fn new() -> Day1
{
Day1 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, data_a: vec![], data_b: vec![], distances: vec![], final_result: 0 }
Day1 {
data_set: DataSet::Test,
run_mode: RunMode::FirstCase,
do_debug_prints: false,
do_verbose_prints: false,
data_a: vec![],
data_b: vec![],
distances: vec![],
final_result: 0
}
}
fn solve_first_case(self: &mut Self) -> String
@ -103,11 +114,12 @@ impl Solver for Day1
println!("DATA: {}", data);
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool, enable_verbose_prints: bool)
{
self.data_set = data_set;
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
self.do_verbose_prints = enable_verbose_prints;
let dir = utils::get_working_dir();
let data_filename =

@ -17,6 +17,8 @@ pub struct Day2
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
do_verbose_prints: bool,
reports: Vec<Report>,
pub final_result: i32,
}
@ -28,7 +30,14 @@ impl Day2
{
pub fn new() -> Day2
{
Day2 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, reports: vec![], final_result: 0 }
Day2 {
data_set: DataSet::Test,
run_mode: RunMode::FirstCase,
do_debug_prints: false,
do_verbose_prints: false,
reports: vec![],
final_result: 0
}
}
}
@ -42,11 +51,12 @@ impl Solver for Day2
println!("DAY 2 TEST PRINT");
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool, enable_verbose_prints: bool)
{
self.data_set = data_set;
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
self.do_verbose_prints = enable_verbose_prints;
let dir = utils::get_working_dir();
let data_filename =

@ -18,6 +18,8 @@ pub struct Day3
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
do_verbose_prints: bool,
tokens: Vec<Token>,
mul_ops: Vec<Mul>,
pub final_result: i32,
@ -30,7 +32,15 @@ impl Day3
{
pub fn new() -> Day3
{
Day3 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, tokens: vec![], mul_ops: vec![], final_result: 0 }
Day3 {
data_set: DataSet::Test,
run_mode: RunMode::FirstCase,
do_debug_prints: false,
do_verbose_prints: false,
tokens: vec![],
mul_ops: vec![],
final_result: 0
}
}
fn solve_first_case(self: &mut Self) -> String
@ -88,11 +98,12 @@ impl Solver for Day3
println!("DAY 3 TEST PRINT");
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool, enable_verbose_prints: bool)
{
self.data_set = data_set;
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
self.do_verbose_prints = enable_verbose_prints;
let dir = utils::get_working_dir();
let data_filename =

@ -17,6 +17,8 @@ pub struct Day4
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
do_verbose_prints: bool,
word_grid: Option<WordGrid>,
pub final_result: i32,
}
@ -28,7 +30,14 @@ impl Day4
{
pub fn new() -> Day4
{
Day4 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, word_grid: None, final_result: 0 }
Day4 {
data_set: DataSet::Test,
run_mode: RunMode::FirstCase,
do_debug_prints: false,
do_verbose_prints: false,
word_grid: None,
final_result: 0
}
}
fn solve_first_case(self: &mut Self) -> String
@ -62,11 +71,12 @@ impl Solver for Day4
println!("DAY 4 TEST PRINT");
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool, enable_verbose_prints: bool)
{
self.data_set = data_set;
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
self.do_verbose_prints = enable_verbose_prints;
let dir = utils::get_working_dir();
let data_filename =

@ -16,6 +16,7 @@ pub struct Day5
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
do_verbose_prints: bool,
pub final_result: i32,
rules: Vec<Rule>,
@ -29,8 +30,15 @@ impl Day5
{
pub fn new() -> Day5
{
Day5 { data_set: DataSet::Test, run_mode: RunMode::FirstCase,
do_debug_prints: false, final_result: 0, rules: vec![], updates: vec![] }
Day5 {
data_set: DataSet::Test,
run_mode: RunMode::FirstCase,
do_debug_prints: false,
do_verbose_prints: false,
final_result: 0,
rules: vec![],
updates: vec![]
}
}
fn solve_first_case(self: &mut Self) -> String
@ -112,11 +120,12 @@ impl Solver for Day5
println!("DAY 5 TEST PRINT");
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool, enable_verbose_prints: bool)
{
self.data_set = data_set;
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
self.do_verbose_prints = enable_verbose_prints;
let dir = utils::get_working_dir();
let data_filename =
@ -298,7 +307,7 @@ impl Rule
return true;
}
fn make_valid(self: &Rule, update: &mut Vec<i32>, enable_debug_output: bool)
fn make_valid(self: &Rule, update: &mut Vec<i32>, _enable_debug_output: bool)
{
let mut first_idx = 0;
let mut second_idx = 0;

@ -127,4 +127,4 @@
..........................#........#.........................................................#......#........................##...
.................#....#............#...#...........................#....#....#....#...#...........................................
.............#.......................................................#.........#..................................................
....#.................................#...............#.....#....#......##..............#.......................#........#........
....#.................................#...............#.....#....#......##..............#.......................#........#........

@ -8,6 +8,7 @@
* @brief Advent of Code 2024 day 6 problems
******************************************************************************/
use nalgebra_glm::I32Vec2;
use ::solver_base::solver_base::{Solver, DataSet, RunMode};
use utils::utils;
@ -18,9 +19,12 @@ pub struct Day6
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
do_verbose_prints: bool,
map: Map,
guard_history: Vec<Vec<bool>>,
guard_heatmap: Vec<Vec<bool>>,
guard_position_history: Vec<I32Vec2>,
step_iterations: i32,
pub final_result: i32,
}
@ -31,17 +35,33 @@ impl Day6
{
pub fn new() -> Day6
{
Day6 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false,
map: Map::new(), guard_history: vec![], final_result: 0 }
Day6 {
data_set: DataSet::Test,
run_mode: RunMode::FirstCase,
do_debug_prints: false,
do_verbose_prints: false,
map: Map::new(),
guard_heatmap: vec![],
guard_position_history: vec![],
step_iterations: 0,
final_result: 0
}
}
fn solve_first_case(self: &mut Self) -> String
{
self.step_iterations = 0;
while self.map.guard_is_on_map()
{
let pos = I32Vec2::new(self.map.guard_position().x, self.map.guard_position().y);
if !self.guard_position_history.contains(&pos)
{
self.guard_position_history.push(pos);
}
self.guard_history[self.map.guard_position().x as usize][self.map.guard_position().y as usize] = true;
self.guard_heatmap[self.map.guard_position().x as usize][self.map.guard_position().y as usize] = true;
self.map.step_guard();
self.step_iterations += 1;
}
if self.do_debug_prints
@ -52,7 +72,7 @@ impl Day6
let mut num_locations = 0;
for row in &self.guard_history
for row in &self.guard_heatmap
{
for b in row
{
@ -66,13 +86,85 @@ impl Day6
self.final_result = num_locations;
self.final_result.to_string()
}
fn solve_second_case(self: &mut Self) -> String
{
// Need the normal path the guard will take without modifying the map first so just....
self.solve_first_case();
println!("Step Iterations: {}", self.step_iterations);
// Should only need to check the spots the guard visits normally for potential locations for new blockers
// So the self.guard_history vector should now contain all potential locations for new blockers.
// first attempt: I guess just try brute force with upper-limit for step iterations to guess that it's stuck
// The normal path is 5532 step iterations so maybe 10,000 is enough to determine it is stuck?
let stuck_limit = 10000; // 100,000 to double check -- 10,000 works! 1995 is the correct answer
let mut found_locations: Vec<I32Vec2> = vec![];
if self.do_verbose_prints
{
println!("Positions to test: {}\nTesting...", self.guard_position_history.len());
println!("0%");
}
for (i, pos) in self.guard_position_history.iter().enumerate()
{
if self.do_verbose_prints
{
if i == self.guard_position_history.len() / 4
{
println!("25%");
}
if i == self.guard_position_history.len() / 2
{
println!("50%");
}
let target = self.guard_position_history.len() / 2 + self.guard_position_history.len() / 4;
if i == target
{
println!("75%");
}
}
self.map.reset_guard();
self.map.clear_visited();
let mut iterations = 0;
let mut possibly_stuck = false;
let mut map_clone = self.map.clone();
map_clone.add_blocker_at(&pos);
while map_clone.guard_is_on_map()
{
map_clone.step_guard();
iterations += 1;
if iterations >= stuck_limit
{
possibly_stuck = true;
break;
}
}
if possibly_stuck
{
found_locations.push(*pos);
}
}
if self.do_verbose_prints
{
println!("100%");
}
self.final_result = found_locations.len() as i32;
self.final_result.to_string()
}
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@ -85,11 +177,12 @@ impl Solver for Day6
println!("DAY 6 TEST PRINT");
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool, enable_verbose_prints: bool)
{
self.data_set = data_set;
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
self.do_verbose_prints = enable_verbose_prints;
let dir = utils::get_working_dir();
let data_filename =
@ -109,7 +202,7 @@ impl Solver for Day6
self.map.print();
}
self.guard_history = vec![vec![false; self.map.width() as usize]; self.map.height() as usize];
self.guard_heatmap = vec![vec![false; self.map.width() as usize]; self.map.height() as usize];
}
fn solve(self: &mut Self) -> String

@ -31,6 +31,7 @@ pub enum Direction
pub struct Map
{
map: Vec<Vec<MapCell>>,
guard_start_pos: I32Vec2,
guard_direction: Direction,
guard_pos: nalgebra_glm::I32Vec2,
}
@ -39,7 +40,7 @@ impl Map
{
pub fn new() -> Map
{
Map { map: vec![], guard_direction: Direction::North, guard_pos: I32Vec2::new(0, 0) }
Map { map: vec![], guard_start_pos: I32Vec2::new(0, 0), guard_direction: Direction::North, guard_pos: I32Vec2::new(0, 0) }
}
pub fn parse(data: &str) -> Map
@ -72,7 +73,7 @@ impl Map
}
}
Map { map, guard_direction: Direction::North, guard_pos }
Map { map, guard_start_pos: guard_pos, guard_direction: Direction::North, guard_pos }
}
pub fn print(self: &Map)
@ -125,6 +126,11 @@ impl Map
self.map.len() as i32
}
pub fn add_blocker_at(self: &mut Map, at: &I32Vec2)
{
self.map[at.x as usize][at.y as usize] = MapCell::Block;
}
/// Step Rules:
///
/// If there is something directly in front of you, turn right 90 degrees.
@ -170,8 +176,8 @@ impl Map
{
pos.x >= 0 &&
pos.y >= 0 &&
(pos.x as usize) < self.map[0].len() &&
(pos.y as usize) < self.map.len()
(pos.x as usize) < self.map.len() &&
(pos.y as usize) < self.map[0].len()
}
pub fn guard_position(self: &Map) -> I32Vec2
@ -202,4 +208,24 @@ impl Map
};
}
pub fn reset_guard(self: &mut Map)
{
self.guard_pos = self.guard_start_pos;
self.guard_direction = Direction::North;
}
pub fn clear_visited(self: &mut Map)
{
for row in &mut self.map
{
for c in row
{
if *c == MapCell::Visited
{
*c = MapCell::Space;
}
}
}
}
}

@ -16,6 +16,8 @@ pub struct Day7
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
do_verbose_prints: bool,
pub final_result: i32,
}
@ -26,7 +28,12 @@ impl Day7
{
pub fn new() -> Day7
{
Day7 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, final_result: 0 }
Day7 { data_set: DataSet::Test,
run_mode: RunMode::FirstCase,
do_debug_prints: false,
do_verbose_prints: false,
final_result: 0
}
}
fn solve_first_case(self: &mut Self) -> String
@ -53,11 +60,12 @@ impl Solver for Day7
println!("DAY 7 TEST PRINT");
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool, enable_verbose_prints: bool)
{
self.data_set = data_set;
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
self.do_verbose_prints = enable_verbose_prints;
let dir = utils::get_working_dir();
let data_filename =

@ -12,7 +12,6 @@ pub enum DataSet
{
Test,
TestAlt,
//BALLS,
Full,
}
@ -25,6 +24,6 @@ pub trait Solver
println!("SOLVER BASE PRINT TEST");
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool);
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool, enable_verbose_prints: bool);
fn solve(self: &mut Self) -> String;
}

@ -19,12 +19,12 @@ fn main()
{
// DAY 1
let mut day_1 = Day1::new();
day_1.init(DataSet::Full, RunMode::FirstCase, false);
day_1.init(DataSet::Full, RunMode::FirstCase, false, false);
let day1_result = day_1.solve();
println!("Day 1 Part 1 Final Result: {}", day1_result);
let mut day_1 = Day1::new();
day_1.init(DataSet::Full, RunMode::SecondCase, false);
day_1.init(DataSet::Full, RunMode::SecondCase, false, false);
let day1_result = day_1.solve();
println!("Day 1 Part 2 Final Result: {}", day1_result);
@ -33,12 +33,12 @@ 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, false, false);
let day2_result = day_2.solve();
println!("Day 2 Part 1 Final Result: {}", day2_result);
let mut day_2 = Day2::new();
day_2.init(DataSet::Full, RunMode::SecondCase, false);
day_2.init(DataSet::Full, RunMode::SecondCase, false, false);
let day2_result = day_2.solve();
println!("Day 2 Part 2 Final Result: {}", day2_result);
@ -46,12 +46,12 @@ fn main()
// DAY 3
let mut day_3 = Day3::new();
day_3.init(DataSet::Full, RunMode::FirstCase, false);
day_3.init(DataSet::Full, RunMode::FirstCase, false, false);
let day3_result = day_3.solve();
println!("Day 3 Part 1 Final Result: {}", day3_result);
let mut day_3 = Day3::new();
day_3.init(DataSet::Full, RunMode::SecondCase, false);
day_3.init(DataSet::Full, RunMode::SecondCase, false, false);
let day3_result = day_3.solve();
println!("Day 3 Part 2 Final Result: {}", day3_result);
@ -59,12 +59,12 @@ fn main()
// DAY 4
let mut day_4 = Day4::new();
day_4.init(DataSet::Full, RunMode::FirstCase, false);
day_4.init(DataSet::Full, RunMode::FirstCase, false, false);
let day4_result = day_4.solve();
println!("Day 4 Part 1 Final Result: {}", day4_result);
let mut day_4 = Day4::new();
day_4.init(DataSet::Full, RunMode::SecondCase, false);
day_4.init(DataSet::Full, RunMode::SecondCase, false, false);
let day4_result = day_4.solve();
println!("Day 4 Part 2 Final Result: {}", day4_result);
@ -72,12 +72,12 @@ fn main()
// DAY 5
let mut day_5 = Day5::new();
day_5.init(DataSet::Full, RunMode::FirstCase, false);
day_5.init(DataSet::Full, RunMode::FirstCase, false, false);
let day5_result = day_5.solve();
println!("Day 5 Part 1 Final Result: {}", day5_result);
let mut day_5 = Day5::new();
day_5.init(DataSet::Full, RunMode::SecondCase, false);
day_5.init(DataSet::Full, RunMode::SecondCase, false, false);
let day5_result = day_5.solve();
println!("Day 5 Part 2 Final Result: {}", day5_result);
@ -85,14 +85,14 @@ fn main()
// DAY 6
let mut day_6 = Day6::new();
day_6.init(DataSet::Full, RunMode::FirstCase, false);
day_6.init(DataSet::Full, RunMode::FirstCase, false, false);
let day6_result = day_6.solve();
println!("Day 6 Part 1 Final Result: {}", day6_result);
// let mut day_6 = Day6::new();
// day_6.init(DataSet::Full, RunMode::SecondCase, false);
// let day6_result = day_6.solve();
// println!("Day 6 Part 2 Final Result: {}", day6_result);
let mut day_6 = Day6::new();
day_6.init(DataSet::Full, RunMode::SecondCase, false, true);
let day6_result = day_6.solve();
println!("Day 6 Part 2 Final Result: {}", day6_result);
println!("-------------------------");

Loading…
Cancel
Save