#![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_mut)] use regex::Regex; use std::env; use std::fs::File; use std::io::Read; fn main() { let args: Vec = env::args().collect(); let filename = if args.len() == 1 { "in/".to_owned() + args[0].split('/').last().unwrap() + ".pzl" } else { args[1].clone() }; 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 = content.trim_end().split("\n"); let re = Regex::new(r"mul\(([0-9]+),([0-9]+)\)").unwrap(); let res1 = lines .clone() .map(|line| { re.captures_iter(line) .map(|caps| { let p = |n| caps.get(n).unwrap().as_str().parse::().unwrap(); p(1) * p(2) }) .sum::() }) .sum::(); let re2 = Regex::new(r"^mul\(([0-9]+),([0-9]+)\)").unwrap(); let mut res2 = 0; let mut valid = true; for line in lines { for i in 0..line.len() { if line[i..].starts_with("do()") { valid = true; } else if line[i..].starts_with("don't()") { valid = false; } else if valid && re2.is_match(&line[i..]) { let cap = re2.captures(&line[i..]).unwrap(); let p = |n| cap.get(n).unwrap().as_str().parse::().unwrap(); res2 += p(1) * p(2); } } } println!("res1: {}", res1); println!("res2: {}", res2); assert_eq!(res1, 162813399); assert_eq!(res2, 53783319); }