From 1e34e0abea63be35ef860b5b740f4a72c342ed0c Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Mon, 6 Dec 2021 20:42:24 -0800 Subject: [PATCH] Day 4 try using bit comparisons to find bingo. This is actually slower for some reason. --- 2021/src/day4.rs | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/2021/src/day4.rs b/2021/src/day4.rs index 99e4b62..21a47d4 100644 --- a/2021/src/day4.rs +++ b/2021/src/day4.rs @@ -153,6 +153,26 @@ impl MarkerBoard { let bit = 1 << (x + y * 5); (self.0 & bit) != 0 } + + fn is_bingo(&self) -> bool { + let h = 0b11111; + let v = 0b00001_00001_00001_00001_00001; + let m = self.0; + + // Bingo horizontally + false + || (m & h == h) + || ((m >> 5 & h) == h) + || ((m >> 10 & h) == h) + || ((m >> 15 & h) == h) + || ((m >> 20 & h) == h) + // Bingo vertically + || ((m & v) == v) + || ((m >> 1 & v) == v) + || ((m >> 2 & v) == v) + || ((m >> 3 & v) == v) + || ((m >> 4 & v) == v) + } } #[derive(Default)] @@ -169,17 +189,7 @@ enum BoardError { impl Board { fn is_bingo(&self) -> bool { - for y in 0..5 { - if (0..5).all(|x| self.marked.is_marked((x, y))) { - return true; - } - } - for x in 0..5 { - if (0..5).all(|y| self.marked.is_marked((x, y))) { - return true; - } - } - false + self.marked.is_bingo() } fn sum_uncovered(&self) -> u64 { self.numbers