Finished day 4 aoc 2023, just in time for the end of the day

This commit is contained in:
2023-12-04 16:53:45 +01:00
parent fef86c8b84
commit 6f8d539c0c

View File

@@ -1,3 +1,4 @@
use std::cmp::min;
use std::collections::HashSet; use std::collections::HashSet;
use nom::{ use nom::{
@@ -40,10 +41,37 @@ fn card_score(card: &(Vec<u32>, Vec<u32>)) -> u32 {
} }
} }
fn card_wins(card: &(Vec<u32>, Vec<u32>)) -> 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<u32>, Vec<u32>)]) -> u32 { fn solve_1(scratchcards: &[(Vec<u32>, Vec<u32>)]) -> u32 {
scratchcards.iter().map(card_score).sum() scratchcards.iter().map(card_score).sum()
} }
fn solve_2(scratchcards: &[(Vec<u32>, Vec<u32>)]) -> u32 {
let mut number_of_cards = vec![1; scratchcards.len()];
let card_wins = scratchcards.iter().map(card_wins).collect::<Vec<_>>();
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() { fn main() {
println!("Hello, this is Patrick!"); println!("Hello, this is Patrick!");
@@ -55,6 +83,11 @@ fn main() {
"The scratchcards are worth {} points", "The scratchcards are worth {} points",
solve_1(&scratchcards[..]) solve_1(&scratchcards[..])
); );
println!(
"The total number of scratchcards is {}",
solve_2(&scratchcards[..])
);
} }
#[cfg(test)] #[cfg(test)]
@@ -69,4 +102,13 @@ mod tests {
assert_eq!(solve_1(&scratchcards[..]), 13); 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);
}
} }