Finished day 4 aoc 2023, just in time for the end of the day
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user