From 61fb240622bffb327e09c3770a94edeeae98d308 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Mon, 20 Dec 2021 18:24:37 +0100 Subject: [PATCH] Avoid 2/3 hashmap lookups --- 2021/src/day20.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/2021/src/day20.rs b/2021/src/day20.rs index be61a07..9f113bf 100644 --- a/2021/src/day20.rs +++ b/2021/src/day20.rs @@ -39,28 +39,30 @@ fn find_dimensions(field: &Field) -> ((i32, i32), (i32, i32)) { } fn advance(translation: &Translation, field: &Field, new_field: &mut Field, infinity: &mut bool) { + const INDEX_MASK: usize = (1 << 9) - 1; new_field.clear(); let ((xmin, xmax), (ymin, ymax)) = find_dimensions(field); for x in (xmin - 1)..=(xmax + 1) { + let mut index = if *infinity { INDEX_MASK } else { 0 }; + for y in (ymin - 1)..=(ymax + 1) { - let mut index = 0; - for dy in -1..=1 { - for dx in -1..=1 { - index <<= 1; + for dx in -1..=1 { + index <<= 1; - let nx = x + dx; - let ny = y + dy; + let nx = x + dx; + let ny = y + 1; - if nx < xmin || nx > xmax || ny < ymin || ny > ymax { - index |= *infinity as usize; - } else if field.contains(&(x + dx, y + dy)) { - index |= 1; - } + if nx < xmin || nx > xmax || ny < ymin || ny > ymax { + index |= *infinity as usize; + } else if field.contains(&(nx, ny)) { + index |= 1; } } + index &= INDEX_MASK; + if translation[index] { new_field.insert((x, y)); }