use std::cmp::min; use std::fs::read_to_string; use std::collections::HashSet; struct Card { numbers: Vec, winners: HashSet } fn count_wins(card: &Card) -> usize { let mut hits = 0; for number in &card.numbers { if card.winners.contains(&number) { hits += 1; } } hits } fn main() { let cards = read_to_string("input.txt").unwrap().lines().map(|line| { let (_, card) = line.split_once(':').unwrap(); let (numbers, winners) = card.split_once('|').unwrap(); let numbers = numbers.split(' ').filter(|numstr| { !numstr.is_empty() }).map(|number| { number.parse::().unwrap() }).collect::>(); let winners = winners.split(' ').filter(|numstr| { !numstr.is_empty() }).map(|number| { number.parse::().unwrap() }).collect::>(); Card{numbers: numbers, winners: winners} }).collect::>(); let mut stacks = vec![1; cards.len()]; for idx in 0..stacks.len() { let score = count_wins(&cards[idx]); for wins in (idx + 1)..min(idx + score + 1, stacks.len()) { stacks[wins] += stacks[idx]; } } println!("Total #cards: {}", stacks.iter().sum::()); }