Day 4 aoc part 1 finished, almost caught up now

This commit is contained in:
2023-12-04 16:32:37 +01:00
parent b0f8da2b5d
commit fef86c8b84
4 changed files with 300 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
use std::collections::HashSet;
use nom::{
bytes::complete::tag,
character::complete::{digit1, multispace1, u32},
multi::separated_list1,
sequence::{preceded, separated_pair, tuple},
IResult,
};
fn parse_input(input: &str) -> IResult<&str, Vec<(Vec<u32>, Vec<u32>)>> {
let (input, result) = separated_list1(
multispace1,
preceded(
tuple((tag("Card"), multispace1, digit1, tag(":"), multispace1)),
separated_pair(
separated_list1(multispace1, u32),
tuple((multispace1, tag("|"), multispace1)),
separated_list1(multispace1, u32),
),
),
)(input)?;
Ok((input, result))
}
fn card_score(card: &(Vec<u32>, Vec<u32>)) -> u32 {
let winning_numbers: HashSet<&u32> = HashSet::from_iter(card.0.iter());
let wins = card
.1
.iter()
.filter(|&number| winning_numbers.contains(number))
.count();
if wins == 0 {
0
} else {
2_u32.pow(wins as u32 - 1)
}
}
fn solve_1(scratchcards: &[(Vec<u32>, Vec<u32>)]) -> u32 {
scratchcards.iter().map(card_score).sum()
}
fn main() {
println!("Hello, this is Patrick!");
let input_txt = include_str!("../input.txt");
let (_, scratchcards) = parse_input(input_txt).unwrap();
println!(
"The scratch cards are worth {} points",
solve_1(&scratchcards[..])
);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_1() {
let input_text = include_str!("../test_input.txt");
let (_, scratchcards) = parse_input(input_text).unwrap();
assert_eq!(solve_1(&scratchcards[..]), 13);
}
}