From 3fd3ad85585c268a0afe3efa0c4423612ba0beb2 Mon Sep 17 00:00:00 2001 From: Wesley Moore Date: Mon, 4 Dec 2023 16:49:36 +1000 Subject: [PATCH] 2023: Day 4, part 2 --- 2023/day4/src/main.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/2023/day4/src/main.rs b/2023/day4/src/main.rs index 9e6e252..e114837 100644 --- a/2023/day4/src/main.rs +++ b/2023/day4/src/main.rs @@ -10,6 +10,8 @@ fn main() -> Result<(), Box> { let mut points = Vec::new(); + let card_count = input.trim().lines().count().try_into()?; + let mut copies = vec![0; card_count]; for line in input.lines() { if line.is_empty() { continue; @@ -17,6 +19,12 @@ fn main() -> Result<(), Box> { let (fst, mine) = line.split_once(" | ").ok_or("expected |")?; let (fst, winning) = fst.split_once(": ").ok_or("expected :")?; let (_, card) = fst.split_once(' ').ok_or("expected ' '")?; + let card = card + .trim() + .parse() + .ok() + .and_then(|n: usize| n.checked_sub(1)) + .ok_or("invalid card number")?; let mine = mine .split(' ') .filter(|s| !s.is_empty()) @@ -28,14 +36,30 @@ fn main() -> Result<(), Box> { .map(|n| n.parse()) .collect::, _>>()?; - let count: u32 = winning.intersection(&mine).count().try_into().unwrap(); + let count = winning.intersection(&mine).count(); if count > 0 { - points.push(2_u64.pow(count - 1)); + points.push(2_u64.pow((count - 1).try_into()?)); } + + // part 2 calculations + // add the current card to the count + copies[card] += 1; + let instances = copies[card]; + + // add 'count' copies of subsequent cards + let next_card = card + 1; + (next_card..next_card + count).for_each(|n| { + if let Some(entry) = copies.get_mut(n) { + *entry += instances; + } + }); } let total_points: u64 = points.iter().sum(); + let total_cards: u64 = copies.iter().sum(); + println!("Part 1: {}", total_points); + println!("Part 2: {}", total_cards); Ok(()) }