From eb1e1a5120e3029cbf0c1892290e2b42944bfb59 Mon Sep 17 00:00:00 2001 From: Daniel Bulant Date: Sun, 17 Dec 2023 00:59:57 +0100 Subject: [PATCH] working optimizations --- 2023/16/src/main.rs | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/2023/16/src/main.rs b/2023/16/src/main.rs index 6b2599d..c2a4585 100644 --- a/2023/16/src/main.rs +++ b/2023/16/src/main.rs @@ -1,8 +1,29 @@ -use std::{fs::File, io::{BufReader, BufRead, Write}, ops::Add, fmt::Debug, collections::HashSet, hash::{Hasher, BuildHasherDefault}}; +use std::{fs::File, io::{BufReader, BufRead, Write}, ops::Add, fmt::Debug, collections::HashSet, hash::{Hasher, BuildHasherDefault}, process::exit}; fn main() { part1(); part2(); + // let mut values = HashSet::new(); + // for x in 0..110 { + // for y in 0..110 { + // let vecs = [ + // VEC_RIGHT, + // VEC_LEFT, + // VEC_UP, + // VEC_DOWN + // ]; + // for vec in vecs { + // // let vecval = ((vec.x+2)*vec.x.abs()+(vec.y+3)*vec.y.abs() - 1) as usize; + // let vecval = (vec.x+1)*vec.x.abs()+(vec.y+2)*vec.y.abs(); + // let val = (x * 111 + y + 1) << 2 | vecval as usize; + // println!("{} {} {:?} val={} vecval(plex)={}", x, y, vec, val, vecval); + // if !values.insert(val) { + // println!("Collision at {},{} with {:?} {}", x, y, vec, val); + // exit(1); + // } + // } + // } + // } } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -47,9 +68,15 @@ struct Beam { vector: Vector } +// const VECTOR_VALUES_HASH: [usize; 13] = [ +// 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3 +// ]; + impl Beam { - fn to_u64(&self) -> u64 { - (self.point.x * 100 + self.point.y) * (1 + self.vector.x + 2 * (self.vector.y + 1)) + fn to_u64(&self) -> usize { + let vecval = (self.vector.x+1)*self.vector.x.abs()+(self.vector.y+2)*self.vector.y.abs(); + let val = (self.point.x * 110 + self.point.y + 1) << 2 | vecval as usize; + val } } @@ -253,9 +280,11 @@ fn setup() -> (Point, Vec>, Vec>) { fn get_count(max_point: Point, rows: Vec>, columns: Vec>, beam: Beam) -> usize { let mut energized : Vec> = vec![vec![false; max_point.x]; max_point.y]; - let mut beams_set = HashSet::>::default(); + // let mut beams_set = HashSet::>::default(); + let mut beams_set_vec = vec![false; (max_point.x + 1) * (max_point.y + 1) * 4]; let mut beams : Vec = vec![beam]; - beams_set.insert(beams[0]); + // beams_set.insert(beams[0]); + beams_set_vec[beams[0].to_u64()] = true; let mut offset = 0; @@ -307,7 +336,10 @@ fn get_count(max_point: Point, rows: Vec>, columns: Vec