From 3c5c7a3e09dc26c304921eadbcb4ef04f93c9303 Mon Sep 17 00:00:00 2001 From: nekineki Date: Tue, 3 Dec 2024 07:23:39 +0100 Subject: day03 --- 2024/day03.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 2024/day03.rs (limited to '2024/day03.rs') diff --git a/2024/day03.rs b/2024/day03.rs new file mode 100644 index 0000000..926329c --- /dev/null +++ b/2024/day03.rs @@ -0,0 +1,56 @@ +#![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); +} -- cgit v1.2.3