From e50b812aedd73c9d7f99cefd3c4ab2a09830ebe3 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 4 Dec 2021 11:40:40 +0100 Subject: [PATCH] Day 4: more efficiently ignore completed cards --- 2021/src/day04.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/2021/src/day04.rs b/2021/src/day04.rs index b5eaa69..1a1fc18 100644 --- a/2021/src/day04.rs +++ b/2021/src/day04.rs @@ -58,7 +58,7 @@ fn read_input(input: &mut dyn Read) -> (Vec, Vec) { let mut bingo_cards = Vec::new(); while reader.next().is_some() { - let mut mapping = HashMap::new(); + let mut mapping = HashMap::with_capacity(25); for y in 0..5 { reader @@ -99,16 +99,20 @@ pub fn part1(input: &mut dyn Read) -> String { pub fn part2(input: &mut dyn Read) -> String { let (numbers, mut bingo_cards) = read_input(input); + let mut bingo_won = vec![false; bingo_cards.len()]; + let mut num_won = 0; + let to_win = bingo_cards.len(); - for number in numbers { - bingo_cards.iter_mut().for_each(|card| { - card.cross(number); - }); + for num in numbers { + for (won, card) in bingo_won.iter_mut().zip(bingo_cards.iter_mut()) { + if !*won && card.cross(num) && card.has_won() { + *won = true; + num_won += 1; - if bingo_cards.len() == 1 && bingo_cards[0].cross(number) && bingo_cards[0].has_won() { - return (number as u32 * bingo_cards[0].remaining()).to_string(); - } else { - bingo_cards.retain(|card| !card.has_won()); + if num_won == to_win { + return (num as u32 * card.remaining()).to_string(); + } + } } }