working optimizations

This commit is contained in:
Daniel Bulant 2023-12-17 00:59:57 +01:00
parent ff63902fb2
commit eb1e1a5120

View file

@ -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() { fn main() {
part1(); part1();
part2(); 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)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
@ -47,9 +68,15 @@ struct Beam {
vector: Vector vector: Vector
} }
// const VECTOR_VALUES_HASH: [usize; 13] = [
// 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3
// ];
impl Beam { impl Beam {
fn to_u64(&self) -> u64 { fn to_u64(&self) -> usize {
(self.point.x * 100 + self.point.y) * (1 + self.vector.x + 2 * (self.vector.y + 1)) 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<MapPoint>>, Vec<Vec<MapPoint>>) {
fn get_count(max_point: Point, rows: Vec<Vec<MapPoint>>, columns: Vec<Vec<MapPoint>>, beam: Beam) -> usize { fn get_count(max_point: Point, rows: Vec<Vec<MapPoint>>, columns: Vec<Vec<MapPoint>>, beam: Beam) -> usize {
let mut energized : Vec<Vec<bool>> = vec![vec![false; max_point.x]; max_point.y]; let mut energized : Vec<Vec<bool>> = vec![vec![false; max_point.x]; max_point.y];
let mut beams_set = HashSet::<Beam, BuildHasherDefault<BeamHasher>>::default(); // let mut beams_set = HashSet::<Beam, BuildHasherDefault<BeamHasher>>::default();
let mut beams_set_vec = vec![false; (max_point.x + 1) * (max_point.y + 1) * 4];
let mut beams : Vec<Beam> = vec![beam]; let mut beams : Vec<Beam> = vec![beam];
beams_set.insert(beams[0]); // beams_set.insert(beams[0]);
beams_set_vec[beams[0].to_u64()] = true;
let mut offset = 0; let mut offset = 0;
@ -307,7 +336,10 @@ fn get_count(max_point: Point, rows: Vec<Vec<MapPoint>>, columns: Vec<Vec<MapPoi
vector: v vector: v
}; };
// append_if_not_in(&mut beams, beam); // append_if_not_in(&mut beams, beam);
if beams_set.insert(beam) { // if beams_set.insert(beam) {
let bnum = beam.to_u64();
if beams_set_vec[bnum] == false {
beams_set_vec[bnum] = true;
beams.push(beam); beams.push(beam);
} }
} }