Avoid allocations

This commit is contained in:
2021-12-20 18:14:36 +01:00
parent a98332894f
commit aee25057d6

View File

@@ -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()