#![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 mut res1 = 0; for line in lines.clone() { res1 += re .captures_iter(line) .map(|caps| { let p = |name| caps.name(name).unwrap().as_str().parse::().unwrap(); p("a") * p("b") }) .fold(0, |a, b| a + b); } let re_m = Regex::new(r"^mul\((?[0-9]+),(?[0-9]+)\)").unwrap(); let re_do = Regex::new(r"^do\(\)").unwrap(); let re_dont = Regex::new(r"^don't\(\)").unwrap(); let mut res2 = 0; let mut valid = true; for line in lines { for i in 0..line.len() { if re_do.is_match(&line[i..]) { valid = true; } else if re_dont.is_match(&line[i..]) { valid = false; } else if valid && re_m.is_match(&line[i..]) { let cap = re_m.captures(&line[i..]).unwrap(); let p = |name| cap.name(name).unwrap().as_str().parse::().unwrap(); res2 += p("a") * p("b"); } } } println!("res1: {}", res1); println!("res2: {}", res2); assert_eq!(res1, 162813399); assert_eq!(res2, 53783319); }