generated from janezicmatej/aoc-template
solution: day 4
This commit is contained in:
parent
000000906f
commit
0000010044
|
@ -0,0 +1,6 @@
|
||||||
|
Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53
|
||||||
|
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
|
||||||
|
Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1
|
||||||
|
Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83
|
||||||
|
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
|
||||||
|
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11
|
|
@ -0,0 +1,79 @@
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use aoc::parsers::to_vec;
|
||||||
|
|
||||||
|
struct ParseCardError;
|
||||||
|
|
||||||
|
struct Card {
|
||||||
|
winning: Vec<u32>,
|
||||||
|
numbers: Vec<u32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Card {
|
||||||
|
type Err = ParseCardError;
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
let (_, rest) = s.split_once(": ").unwrap();
|
||||||
|
let (win, my) = rest.split_once(" | ").unwrap();
|
||||||
|
|
||||||
|
let winning: Vec<u32> = to_vec(win, ' ');
|
||||||
|
let numbers: Vec<u32> = to_vec(my, ' ');
|
||||||
|
|
||||||
|
Ok(Card { winning, numbers })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Card {
|
||||||
|
fn n_matches(&self) -> usize {
|
||||||
|
self.numbers
|
||||||
|
.iter()
|
||||||
|
.filter(|n| self.winning.contains(n))
|
||||||
|
.count()
|
||||||
|
}
|
||||||
|
fn score(&self) -> u32 {
|
||||||
|
let c = self.n_matches();
|
||||||
|
|
||||||
|
if c == 0 {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
2_u32.pow((self.n_matches() - 1) as u32)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<u32> {
|
||||||
|
Some(
|
||||||
|
input
|
||||||
|
.lines()
|
||||||
|
.filter_map(|l| l.parse::<Card>().ok())
|
||||||
|
.map(|g| g.score())
|
||||||
|
.sum(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_two(input: &str) -> Option<u32> {
|
||||||
|
let cards: Vec<Card> = to_vec(input, '\n');
|
||||||
|
let mut multiples = vec![1; cards.len()];
|
||||||
|
|
||||||
|
for (i, card) in cards.iter().enumerate() {
|
||||||
|
for j in 0..card.n_matches() {
|
||||||
|
multiples[i + j + 1] += multiples[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(multiples.iter().sum::<u32>())
|
||||||
|
}
|
||||||
|
|
||||||
|
aoc::solution!(4);
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn test_part_one() {
|
||||||
|
assert_eq!(part_one(&aoc::template::read_file("examples", 4)), Some(13));
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_part_two() {
|
||||||
|
assert_eq!(part_two(&aoc::template::read_file("examples", 4)), Some(30));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue