]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day03 - part 1
authoralex <>
Tue, 3 Dec 2024 08:20:27 +0000 (09:20 +0100)
committeralex <>
Tue, 3 Dec 2024 08:20:27 +0000 (09:20 +0100)
Cargo.toml
src/day03.rs [new file with mode: 0644]
src/main.rs

index 74b5bcc19ffcd662664e32be40934c67a133cc30..6ca4d87e7d597d0b8a6f011a3693cd1597083c01 100644 (file)
@@ -4,3 +4,4 @@ version = "0.1.0"
 edition = "2021"
 
 [dependencies]
+regex = "1.11.1"
diff --git a/src/day03.rs b/src/day03.rs
new file mode 100644 (file)
index 0000000..a650dfd
--- /dev/null
@@ -0,0 +1,61 @@
+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());
+    }
+}
index fde930333e6b2a6b85341d16df0e6adaa0ecfd6c..fb8a3511fe4ff57a59cd909979489f4151fe931c 100644 (file)
@@ -6,6 +6,7 @@ use std::io::Read;
 
 pub mod day01;
 pub mod day02;
+pub mod day03;
 
 fn main() {
     let args: Vec<String> = env::args().collect();
@@ -30,6 +31,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box<dyn Error>> {
     match day {
         "day01" => day01::run(&input)?,
         "day02" => day02::run(&input)?,
+        "day03" => day03::run(&input)?,
         _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()),
     }
     Ok(())