#![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_mut)] use std::fs::File; use std::io::Read; fn main() { // let filename = "in/day04.ref"; let filename = "in/day04.pzl"; let mut f = File::open(filename).expect("cannot open file"); let mut content = String::new(); f.read_to_string(&mut content).expect("cannot read file"); let lines: Vec<_> = content.trim_end().split('\n').collect(); // println!("{:?}", lines); let mut res1 = 0; let mut counts: Vec = Vec::new(); for line in &lines { let s1: Vec<&str> = line.split(":").collect(); let game_num: u32 = s1[0] .replace(" ", " ") .replace(" ", " ") .split(" ") .collect::>()[1] .parse() .unwrap(); let s2: Vec<&str> = s1[1].trim().split("|").collect::>(); let winning: Vec = s2[0] .trim() .replace(" ", " ") .split(" ") .map(|x| x.parse::().unwrap()) .collect(); let actual: Vec = s2[1] .trim() .replace(" ", " ") .replace(" ", " ") .split(" ") .map(|x| x.parse::().unwrap()) .collect(); let count: i32 = actual.iter().filter(|x| winning.contains(x)).count() as i32; counts.push(count); // println!("{}", count); res1 += 1_i32.checked_shl((count - 1) as u32).unwrap_or(0); } let mut copies: Vec = vec![0; counts.len()]; for i in 0..counts.len() { for j in i..i + counts[i] as usize { copies[j + 1] += 1 + copies[i]; } } let res2 = copies.iter().sum::() + copies.len() as i32; println!("res1: {}", res1); println!("res2: {}", res2); assert_eq!(res1, 21919); assert_eq!(res2, 9881048); }