Day 4 aoc part 1 finished, almost caught up now
This commit is contained in:
72
advent_of_code/2023/4/src/main.rs
Normal file
72
advent_of_code/2023/4/src/main.rs
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user