Day 4 perf improvments v1

This commit is contained in:
Bill Thiede 2021-12-06 20:01:48 -08:00
parent 343707c63c
commit 10fe6a570e

View File

@ -140,10 +140,25 @@ impl FromStr for Game {
} }
} }
#[derive(Default)]
struct MarkerBoard(u32);
impl MarkerBoard {
fn mark(&mut self, (x, y): (usize, usize)) {
let bit = 1 << (x + y * 5);
self.0 |= bit;
}
fn is_marked(&self, (x, y): (usize, usize)) -> bool {
let bit = 1 << (x + y * 5);
(self.0 & bit) != 0
}
}
#[derive(Default)] #[derive(Default)]
struct Board { struct Board {
numbers: HashMap<(usize, usize), u64>, numbers: HashMap<(usize, usize), u64>,
marked: HashSet<(usize, usize)>, marked: MarkerBoard,
} }
#[derive(Debug, Error)] #[derive(Debug, Error)]
@ -155,12 +170,12 @@ enum BoardError {
impl Board { impl Board {
fn is_bingo(&self) -> bool { fn is_bingo(&self) -> bool {
for y in 0..5 { for y in 0..5 {
if (0..5).all(|x| self.marked.contains(&(x, y))) { if (0..5).all(|x| self.marked.is_marked((x, y))) {
return true; return true;
} }
} }
for x in 0..5 { for x in 0..5 {
if (0..5).all(|y| self.marked.contains(&(x, y))) { if (0..5).all(|y| self.marked.is_marked((x, y))) {
return true; return true;
} }
} }
@ -170,7 +185,7 @@ impl Board {
self.numbers self.numbers
.iter() .iter()
.map(|((x, y), v)| { .map(|((x, y), v)| {
if !self.marked.contains(&(*x, *y)) { if !self.marked.is_marked((*x, *y)) {
*v *v
} else { } else {
0 0
@ -182,7 +197,7 @@ impl Board {
fn mark(&mut self, num: u64) -> bool { fn mark(&mut self, num: u64) -> bool {
for ((x, y), v) in self.numbers.iter() { for ((x, y), v) in self.numbers.iter() {
if *v == num { if *v == num {
self.marked.insert((*x, *y)); self.marked.mark((*x, *y));
return true; return true;
} }
} }
@ -195,7 +210,7 @@ impl Debug for Board {
writeln!(f)?; writeln!(f)?;
for y in 0..5 { for y in 0..5 {
for x in 0..5 { for x in 0..5 {
if self.marked.contains(&(x, y)) { if self.marked.is_marked((x, y)) {
let v = format!("{:3}", self.numbers[&(x, y)]); let v = format!("{:3}", self.numbers[&(x, y)]);
write!(f, "{}", Green.bold().paint(v))?; write!(f, "{}", Green.bold().paint(v))?;
} else { } else {