]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day07 - part 2
authoralex <>
Sat, 7 Dec 2024 08:32:24 +0000 (09:32 +0100)
committeralex <>
Sat, 7 Dec 2024 08:32:24 +0000 (09:32 +0100)
src/day07.rs

index 1b1f41f928f750e74b5bf3d286b1f47565bf2262..ae83c265f018bdd8d83478c921a065dcd6a7f5f2 100644 (file)
@@ -1,7 +1,28 @@
 use std::error::Error;
 use std::path::Path;
 
-fn possible_values(operands: &[u64]) -> Vec<u64> {
+fn solve(input: &str, with_concat: bool) -> u64 {
+    input.lines()
+        .map(|l| {
+            let (tot, ops) = l.split_once(":").unwrap();
+            let ops = ops.trim().split(" ")
+                .map(|v| v.parse::<u64>().unwrap())
+                .collect::<Vec<u64>>();
+            (tot.parse::<u64>().unwrap(), ops)
+        })
+        .map(|(tot, ops)| {
+            let values = possible_values(&ops, with_concat);
+            if values.contains(&tot) {
+                tot
+            }
+            else {
+                0
+            }
+        })
+        .sum()
+}
+
+fn possible_values(operands: &[u64], with_concat: bool) -> Vec<u64> {
     let mut res: Vec<u64> = Vec::new();
     for o in operands {
         if res.is_empty() {
@@ -13,6 +34,10 @@ fn possible_values(operands: &[u64]) -> Vec<u64> {
             for t in tmp {
                 res.push(t + o);
                 res.push(t * o);
+                if with_concat {
+                    let value = t.to_string() + &o.to_string();
+                    res.push(value.parse::<u64>().unwrap());
+                }
             }
         }
     }
@@ -22,32 +47,13 @@ fn possible_values(operands: &[u64]) -> Vec<u64> {
 fn run_part1(input: &str) -> Result<u64, Box<dyn Error>> {
     println!("Running {} - part 1", get_day());
 
-    let res = input.lines()
-        .map(|l| {
-            let (tot, ops) = l.split_once(":").unwrap();
-            let ops = ops.trim().split(" ")
-                .map(|v| v.parse::<u64>().unwrap())
-                .collect::<Vec<u64>>();
-            (tot.parse::<u64>().unwrap(), ops)
-        })
-        .map(|(tot, ops)| {
-            let values = possible_values(&ops);
-            if values.contains(&tot) {
-                tot
-            }
-            else {
-                0
-            }
-        })
-        .sum();
-
-    Ok(res)
+    Ok(solve(input, false))
 }
 
 fn run_part2(input: &str) -> Result<u64, Box<dyn Error>> {
     println!("Running {} - part 2", get_day());
 
-    Ok(0)
+    Ok(solve(input, true))
 }
 
 pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
@@ -87,6 +93,6 @@ mod tests {
 
     #[test]
     fn test_part2() {
-        assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+        assert_eq!(11387, run_part2(TEXT_INPUT).unwrap());
     }
 }