mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Avoid allocations
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
|
use std::mem::swap;
|
||||||
|
|
||||||
type Translation = [bool; 512];
|
type Translation = [bool; 512];
|
||||||
type Point = (i32, i32);
|
type Point = (i32, i32);
|
||||||
@@ -37,8 +38,8 @@ fn find_dimensions(field: &Field) -> ((i32, i32), (i32, i32)) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn advance(translation: &Translation, field: &Field, infinity: bool) -> (bool, Field) {
|
fn advance(translation: &Translation, field: &Field, new_field: &mut Field, infinity: &mut bool) {
|
||||||
let mut new_field = Field::new();
|
new_field.clear();
|
||||||
|
|
||||||
let ((xmin, xmax), (ymin, ymax)) = find_dimensions(field);
|
let ((xmin, xmax), (ymin, ymax)) = find_dimensions(field);
|
||||||
|
|
||||||
@@ -53,11 +54,9 @@ fn advance(translation: &Translation, field: &Field, infinity: bool) -> (bool, F
|
|||||||
let ny = y + dy;
|
let ny = y + dy;
|
||||||
|
|
||||||
if nx < xmin || nx > xmax || ny < ymin || ny > ymax {
|
if nx < xmin || nx > xmax || ny < ymin || ny > ymax {
|
||||||
index |= infinity as usize;
|
index |= *infinity as usize;
|
||||||
} else {
|
} else if field.contains(&(x + dx, y + dy)) {
|
||||||
if field.contains(&(x + dx, y + dy)) {
|
index |= 1;
|
||||||
index |= 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,17 +67,17 @@ fn advance(translation: &Translation, field: &Field, infinity: bool) -> (bool, F
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(translation[infinity.then(|| 511).unwrap_or(0)], new_field)
|
*infinity = translation[if *infinity { 511 } else { 0 }]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parts_common(input: &mut dyn Read, count: usize) -> String {
|
fn parts_common(input: &mut dyn Read, count: usize) -> String {
|
||||||
let (translation, mut field) = read_input(input);
|
let (translation, mut field) = read_input(input);
|
||||||
|
let mut new_field = Field::new();
|
||||||
let mut infinity = false;
|
let mut infinity = false;
|
||||||
|
|
||||||
for _ in 0..count {
|
for _ in 0..count {
|
||||||
let (new_inf, new_field) = advance(&translation, &field, infinity);
|
advance(&translation, &field, &mut new_field, &mut infinity);
|
||||||
field = new_field;
|
swap(&mut field, &mut new_field);
|
||||||
infinity = new_inf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
field.len().to_string()
|
field.len().to_string()
|
||||||
|
|||||||
Reference in New Issue
Block a user