Day 4 part 2

This commit is contained in:
Pascal Phelipot 2023-12-04 20:29:37 +01:00
parent a7e82af3dc
commit 7f21e6d464
2 changed files with 57 additions and 12 deletions

View File

@ -1,9 +1,13 @@
use std::collections::VecDeque;
use log::debug; use log::debug;
use super::utils::Part; use super::utils::Part;
struct Card { struct Card {
nb_winning: u32 nb_winning: u32,
value: u32,
count: u32
} }
fn parse(line: &str) -> Card { fn parse(line: &str) -> Card {
@ -17,8 +21,10 @@ fn parse(line: &str) -> Card {
debug!("{:?}", nb_card); debug!("{:?}", nb_card);
let mut value = 0; let mut value = 0;
let mut winner_nb = 0;
for nb in nb_card { for nb in nb_card {
if nb_win.contains(&nb) { if nb_win.contains(&nb) {
winner_nb += 1;
if value == 0 { if value == 0 {
value = 1; value = 1;
}else{ }else{
@ -27,27 +33,60 @@ fn parse(line: &str) -> Card {
} }
} }
Card { nb_winning: value } Card { nb_winning: winner_nb, value, count: 1 }
} }
pub fn solve(lines: Vec<String>, part: Part) -> u32 { pub fn solve(lines: Vec<String>, part: Part) -> u32 {
let mut sum = 0; let mut cards : Vec<Card> = lines.iter().map(|l| parse(l)).collect();
for line in lines {
sum += parse(&line).nb_winning;
}
sum
match part {
Part::One => cards.iter().map(|c| c.value).sum(),
Part::Two => {
let mut next_adds : VecDeque<u32> = VecDeque::new();
let mut counter = 0;
for card in &mut cards {
counter += 1;
debug!("Card {}: Adding {} next cards", counter, card.nb_winning);
if let Some(bonus) = next_adds.pop_front(){
// If there is a value, we add it to the current card
card.count += bonus;
debug!("Current card count is {}", card.count);
}
for i in 0..(card.nb_winning) {
// For each value our current card has we add all those on the stack
if let Some(value) = next_adds.get_mut(i as usize){
*value += card.count;
}else{
next_adds.push_back(card.count);
}
}
debug!("Next bonus: {:?}", next_adds);
}
cards.iter().map(|c| c.count).sum()
}
}
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::parse; use super::{parse, solve};
#[test] #[test]
fn test_line() { fn test_line() {
let line = "Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53".to_owned(); let line = "Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53".to_owned();
let card = parse(&line); let card = parse(&line);
assert_eq!(card.nb_winning, 8); assert_eq!(card.value, 8);
}
#[test]
fn test_part2(){
let lines = "Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53\nCard 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19\nCard 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1\nCard 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83\nCard 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36\nCard 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11".to_owned();
let result =solve(lines.lines().map(|v| v.to_owned()).collect(), crate::utils::Part::Two);
assert_eq!(result, 30);
} }
} }

View File

@ -17,9 +17,6 @@ fn main() {
.format_timestamp(None) .format_timestamp(None)
.init(); .init();
let data_path = "./datasets/adventofcode.com_2023_day_4_input.txt";
let result = day4::solve(utils::lines_from_file(data_path).expect("Could not load the dataset for day 3"), Part::One);
info!("Result : {}", result);
} }
@ -57,4 +54,13 @@ mod tests {
assert_eq!(result, 522726); assert_eq!(result, 522726);
assert_eq!(result2, 81721933); assert_eq!(result2, 81721933);
} }
#[test]
fn day4() {
let data_path = "./datasets/adventofcode.com_2023_day_4_input.txt";
let result = day4::solve(utils::lines_from_file(data_path).expect("Could not load the dataset for day 3"), Part::One);
let result2 = day4::solve(utils::lines_from_file(data_path).expect("Could not load the dataset for day 3"), Part::Two);
assert_eq!(result, 20407);
assert_eq!(result2, 23806951);
}
} }