#![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 copies = vec![1; lines.len()]; for (i, line) in lines.into_iter().enumerate() { let (first, rest) = line.split_once(":").unwrap(); let game_num = first.split_once(" ").unwrap().1; let (win, actual) = rest.split_once("|").unwrap(); let parse = |a: &str| { a.split(" ") .filter_map(|x| x.parse().ok()) .collect::>() }; let count = parse(actual) .iter() .filter(|x| parse(win).contains(x)) .count(); if count > 0 { res1 += 1 << (count - 1); } for j in i..i + count { copies[j + 1] += copies[i]; } } let res2: u32 = copies.iter().sum(); println!("res1: {}", res1); println!("res2: {}", res2); assert_eq!(res1, 21919); assert_eq!(res2, 9881048); }