diff --git a/2023/16/src/main.rs b/2023/16/src/main.rs index 312189c..e2bae94 100644 --- a/2023/16/src/main.rs +++ b/2023/16/src/main.rs @@ -1,7 +1,7 @@ use std::{fs::File, io::{BufReader, BufRead, Write}, ops::Add, fmt::Debug, hash::Hasher, sync::Arc}; fn main() { - part1(); + // part1(); part2(); // println!("test"); } @@ -207,10 +207,7 @@ fn setup() -> (Point, Vec>, Vec>) { (max_point, rows, columns) } -fn get_count(max_point: Point, rows: &Vec>, columns: &Vec>, beam: Beam) -> usize { - let mut energized : [[bool; 110]; 110] = [[false; 110]; 110]; - let mut beams_set_vec = vec![false; (max_point.x + 1) * (max_point.y + 1) * 4]; - let mut beams : Vec = Vec::with_capacity(30); +fn get_count(max_point: Point, rows: &Vec>, columns: &Vec>, beam: Beam, beams_set_vec: &mut Vec, energized: &mut [[bool; 110]; 110], beams: &mut Vec) -> usize { beams.push(beam); let b0 = beams[0].to_nums(); beams_set_vec[b0] = true; @@ -244,10 +241,10 @@ fn get_count(max_point: Point, rows: &Vec>, columns: &Vec { - mark(vec, beam.point, if vec.is_positive() { max_point.x } else { 0 }, &mut energized); + mark(vec, beam.point, if vec.is_positive() { max_point.x } else { 0 }, energized); }, Some(mappoint) => { - mark(vec, beam.point, (if vec_is_vertical { mappoint.point.y } else { mappoint.point.x } ) + (if vec.is_positive() { 1 } else { 0 }), &mut energized); + mark(vec, beam.point, (if vec_is_vertical { mappoint.point.y } else { mappoint.point.x } ) + (if vec.is_positive() { 1 } else { 0 }), energized); let point = mappoint.point; let mut try_add = |v: Vector| if !v.will_go_oob(point, max_point) { let new_point = point + v; @@ -273,9 +270,9 @@ fn get_count(max_point: Point, rows: &Vec>, columns: &Vec>, columns: &Vec = Vec::with_capacity(30); let count = get_count(max_point, &rows, &columns, Beam { point: Point { x: 0, y: 0 }, vector: VEC_RIGHT - }); + }, &mut beams_set_vec, &mut energized, &mut beams); println!("Part 1 count: {}", count); } @@ -305,6 +305,9 @@ fn part2() { threads.push( std::thread::spawn(move || { let mut count = 0; + let mut energized : [[bool; 110]; 110] = [[false; 110]; 110]; + let mut beams_set_vec = vec![false; (max_point.x + 1) * (max_point.y + 1) * 4]; + let mut beams : Vec = Vec::with_capacity(30); let is_vert = vector.is_vertical(); let is_pos = vector.is_positive(); let num2 = if !is_pos { max_point.x - 1 } else { 0 }; @@ -313,7 +316,10 @@ fn part2() { point: if is_vert { Point { x: num, y: num2 } } else { Point { x: num2, y: num } }, vector }; - let count_here = get_count(max_point, &rows, &columns, beam); + let count_here = get_count(max_point, &rows, &columns, beam, &mut beams_set_vec, &mut energized, &mut beams); + beams_set_vec.iter_mut().for_each(|b| *b = false); + energized.iter_mut().for_each(|row| row.iter_mut().for_each(|b| *b = false)); + beams.clear(); if count_here > count { count = count_here; }