mirror of
https://github.com/danbulant/adventOfCode
synced 2026-05-21 13:18:40 +00:00
working optimizations
This commit is contained in:
parent
ff63902fb2
commit
eb1e1a5120
1 changed files with 38 additions and 6 deletions
|
|
@ -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<MapPoint>>, Vec<Vec<MapPoint>>) {
|
|||
|
||||
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 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];
|
||||
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<Vec<MapPoint>>, columns: Vec<Vec<MapPoi
|
|||
vector: v
|
||||
};
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue