--- /dev/null
+use std::error::Error;
+use std::path::Path;
+use regex::Regex;
+
+pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
+ let res = run_part1(&input)?;
+ println!("{res}");
+
+ let res = run_part2(&input)?;
+ println!("{res}");
+
+ Ok(())
+}
+
+fn get_day() -> String {
+ let filename = file!();
+ Path::new(filename).file_stem().unwrap().to_str().unwrap().to_string()
+}
+
+fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
+ println!("Running {} - part 1", get_day());
+
+ let re = Regex::new(r"mul\(\d{1,3},\d{1,3}\)").unwrap();
+
+ let res: u32 = re.find_iter(input)
+ .map(|m| m.as_str())
+ .map(|m| {
+ let v = m[4..m.len()-1]
+ .split(",")
+ .map(|v| v.parse::<u32>().unwrap())
+ .collect::<Vec<u32>>();
+ v[0]*v[1]
+ })
+ .sum();
+
+ Ok(res)
+}
+
+fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
+ println!("Running {} - part 2", get_day());
+
+ Ok(0)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ static TEXT_INPUT: &str = "\
+xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))";
+
+ #[test]
+ fn test_part1() {
+ assert_eq!(161, run_part1(TEXT_INPUT).unwrap());
+ }
+
+ #[test]
+ fn test_part2() {
+ assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+ }
+}
pub mod day01;
pub mod day02;
+pub mod day03;
fn main() {
let args: Vec<String> = env::args().collect();
match day {
"day01" => day01::run(&input)?,
"day02" => day02::run(&input)?,
+ "day03" => day03::run(&input)?,
_ => return Err(format!("unknown or unimplemented day \"{day}\"").into()),
}
Ok(())