From 6f8d539c0c708e1c456066b127d0b3233c80ba8f Mon Sep 17 00:00:00 2001 From: Philippe Zwietering Date: Mon, 4 Dec 2023 16:53:45 +0100 Subject: [PATCH] Finished day 4 aoc 2023, just in time for the end of the day --- advent_of_code/2023/4/src/main.rs | 44 ++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/advent_of_code/2023/4/src/main.rs b/advent_of_code/2023/4/src/main.rs index 52db50b..091c7b1 100644 --- a/advent_of_code/2023/4/src/main.rs +++ b/advent_of_code/2023/4/src/main.rs @@ -1,3 +1,4 @@ +use std::cmp::min; use std::collections::HashSet; use nom::{ @@ -40,10 +41,37 @@ fn card_score(card: &(Vec, Vec)) -> u32 { } } +fn card_wins(card: &(Vec, Vec)) -> u32 { + let winning_numbers: HashSet<&u32> = HashSet::from_iter(card.0.iter()); + + card.1 + .iter() + .filter(|&number| winning_numbers.contains(number)) + .count() as u32 +} fn solve_1(scratchcards: &[(Vec, Vec)]) -> u32 { scratchcards.iter().map(card_score).sum() } +fn solve_2(scratchcards: &[(Vec, Vec)]) -> u32 { + let mut number_of_cards = vec![1; scratchcards.len()]; + + let card_wins = scratchcards.iter().map(card_wins).collect::>(); + + for card_number in 0..scratchcards.len() { + for winner_card_numbers in (card_number + 1) + ..min( + scratchcards.len(), + card_number + 1 + card_wins[card_number] as usize, + ) + { + number_of_cards[winner_card_numbers] += number_of_cards[card_number]; + } + } + + number_of_cards.iter().sum() +} + fn main() { println!("Hello, this is Patrick!"); @@ -52,9 +80,14 @@ fn main() { let (_, scratchcards) = parse_input(input_txt).unwrap(); println!( - "The scratch cards are worth {} points", + "The scratchcards are worth {} points", solve_1(&scratchcards[..]) ); + + println!( + "The total number of scratchcards is {}", + solve_2(&scratchcards[..]) + ); } #[cfg(test)] @@ -69,4 +102,13 @@ mod tests { assert_eq!(solve_1(&scratchcards[..]), 13); } + + #[test] + fn test_2() { + let input_text = include_str!("../test_input.txt"); + + let (_, scratchcards) = parse_input(input_text).unwrap(); + + assert_eq!(solve_2(&scratchcards[..]), 30); + } }