]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day02 - part 2
authoralex <>
Mon, 2 Dec 2024 08:17:39 +0000 (09:17 +0100)
committeralex <>
Mon, 2 Dec 2024 08:17:39 +0000 (09:17 +0100)
src/day02.rs

index 71a3f8d9f6a12e1a403f2b785fd77789b8b684f6..6037683a98e3365208375a469b6bbd92650776ec 100644 (file)
@@ -32,7 +32,38 @@ fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
     let filename = Path::new(filename).file_stem().unwrap().to_str().unwrap();
     println!("Running {} - part 1", filename);
 
-    Ok(0)
+    fn is_sorted(level: &[u32]) -> bool {
+        (level.is_sorted_by(|a, b| a < b) || level.is_sorted_by(|a, b| b < a)) &&
+            level.is_sorted_by(|a, b| a.abs_diff(*b) >= 1 && a.abs_diff(*b) <= 3)
+    }
+
+    let levels = input.lines()
+        .map(|l| {
+            l.split(" ")
+                .map(|v| v.parse::<u32>().unwrap())
+                .collect::<Vec<u32>>()
+        });
+
+    let mut res: u32 = 0;
+
+    for level in levels {
+        if is_sorted(&level) {
+            res += 1;
+        }
+        else {
+            for i in 0..level.len() {
+                let l = level.clone();
+                let (a, b) = l.split_at(i);
+                let l = [a, &b[1..]].concat();
+                if is_sorted(&l) {
+                    res += 1;
+                    break;
+                }
+            }
+        }
+    }
+
+    Ok(res)
 }
 
 #[cfg(test)]
@@ -54,6 +85,6 @@ mod tests {
 
     #[test]
     fn test_part2() {
-        assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+        assert_eq!(4, run_part2(TEXT_INPUT).unwrap());
     }
 }