mirror of
https://github.com/danbulant/adventOfCode
synced 2026-06-24 16:31:44 +00:00
experiment with less memory
This commit is contained in:
parent
eb1e1a5120
commit
5502c35f06
1 changed files with 10 additions and 8 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
use std::{fs::File, io::{BufReader, BufRead, Write}, ops::Add, fmt::Debug, collections::HashSet, hash::{Hasher, BuildHasherDefault}, process::exit};
|
use std::{fs::File, io::{BufReader, BufRead, Write}, ops::Add, fmt::Debug, hash::Hasher};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
part1();
|
part1();
|
||||||
|
|
@ -73,10 +73,11 @@ struct Beam {
|
||||||
// ];
|
// ];
|
||||||
|
|
||||||
impl Beam {
|
impl Beam {
|
||||||
fn to_u64(&self) -> usize {
|
fn to_nums(&self) -> (usize, usize) {
|
||||||
let vecval = (self.vector.x+1)*self.vector.x.abs()+(self.vector.y+2)*self.vector.y.abs();
|
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;
|
let val = (self.point.x * 110 + self.point.y + 1) << 2 | vecval as usize;
|
||||||
val
|
(val >> 6, 1 << (val & 63))
|
||||||
|
// 0b1000000000000000000000000000000000000000000000000000000000000000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -281,10 +282,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_set_vec = vec![0; (max_point.x + 1) * (max_point.y + 1) / 8 + 1];
|
||||||
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 b0 = beams[0].to_nums();
|
||||||
|
beams_set_vec[b0.0] = b0.1;
|
||||||
|
|
||||||
let mut offset = 0;
|
let mut offset = 0;
|
||||||
|
|
||||||
|
|
@ -337,9 +339,9 @@ fn get_count(max_point: Point, rows: Vec<Vec<MapPoint>>, columns: Vec<Vec<MapPoi
|
||||||
};
|
};
|
||||||
// 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();
|
let bnum = beam.to_nums();
|
||||||
if beams_set_vec[bnum] == false {
|
if beams_set_vec[bnum.0] & bnum.1 == 0 {
|
||||||
beams_set_vec[bnum] = true;
|
beams_set_vec[bnum.0] |= bnum.1;
|
||||||
beams.push(beam);
|
beams.push(beam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue