diff --git a/src/day4.rs b/src/day4.rs index 375e8ff..0a3c072 100644 --- a/src/day4.rs +++ b/src/day4.rs @@ -1,12 +1,14 @@ use std::collections::HashSet; use std::fs; +use itertools::Itertools; + pub fn run() { println!("Day 4:"); let input = fs::read_to_string("./inputs/day4.txt").expect("Could not read file"); println!("\tPart 1: {}", part1(&input)); - // println!("\tPart 2: {}", part2(&input)); + println!("\tPart 2: {}", part2(&input)); } fn part1(cards: &str) -> usize { @@ -35,8 +37,33 @@ fn part1(cards: &str) -> usize { total_wins } -fn part2(schematic: &str) -> usize { - todo!() +fn part2(cards: &str) -> usize { + let number_of_cards: usize = cards.lines().collect::>().len(); + let mut card_wins = vec![0; number_of_cards]; + + for (current_card_number, card) in cards.lines().enumerate() { + let (_, card_numbers) = card.split_once(':').unwrap(); + let (winners_raw, chances_raw) = card_numbers.split_once('|').unwrap(); + + let winners = winners_raw + .split(' ') + .filter(|s| !s.is_empty()) + .map(|win| win.trim().parse::().unwrap()) + .collect::>(); + let chances = chances_raw + .split(' ') + .filter(|s| !s.is_empty()) + .map(|chance| chance.trim().parse::().unwrap()) + .collect::>(); + + let wins = winners.intersection(&chances).count(); + + for index in 1..=wins { + card_wins[index + current_card_number] += 1 + card_wins[current_card_number]; + } + } + + card_wins.iter().sum::() + number_of_cards } #[cfg(test)] @@ -64,6 +91,6 @@ 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"; - assert_eq!(part2(input), 467835); + assert_eq!(part2(input), 30); } }