]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day04 - part 2
authoralex <>
Wed, 4 Dec 2024 09:20:10 +0000 (10:20 +0100)
committeralex <>
Wed, 4 Dec 2024 09:20:10 +0000 (10:20 +0100)
src/day04.rs

index c885a7a69e56fc6541933fdcc3afcd899f22ac63..f68472f72ac47b6d83b19ee17a943b8c6342648a 100644 (file)
@@ -17,7 +17,7 @@ struct Puzzle {
 }
 
 impl Puzzle {
-    pub fn new(input: &str) -> Self {
+    pub fn new(input: &str, x_char: char) -> Self {
         let mut map: Vec<Vec<char>> = input.lines()
             .map(|l| {
                 let s = ".".to_owned() + l + ".";
@@ -33,7 +33,7 @@ impl Puzzle {
             .for_each(|(r, row)| {
                 row.iter().enumerate()
                     .for_each(|(c, v)| {
-                        if *v == 'X' {
+                        if *v == x_char {
                             x_pos.push((r, c));
                         }
                     });
@@ -59,7 +59,7 @@ fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
         (1,0), (1,-1), (0,-1), (-1,-1),
     ];
 
-    let puzzle = Puzzle::new(input);
+    let puzzle = Puzzle::new(input, 'X');
 
     let mut res: u32 = 0;
 
@@ -86,7 +86,36 @@ fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
 fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
     println!("Running {} - part 2", get_day());
 
-    Ok(0)
+    fn is_mas(coord: (i32, i32), dir: ((i32, i32), (i32, i32)), map: &Vec<Vec<char>>) -> bool {
+        let (r, c) = coord;
+        (
+            map[(r + dir.0.0) as usize][(c + dir.0.1) as usize] == 'M' &&
+            map[(r + dir.1.0) as usize][(c + dir.1.1) as usize] == 'S'
+        ) ||
+        (
+            map[(r + dir.0.0) as usize][(c + dir.0.1) as usize] == 'S' &&
+            map[(r + dir.1.0) as usize][(c + dir.1.1) as usize] == 'M'
+        )
+    }
+
+    let dir = [
+        ((-1,-1), (1,1)),
+        ((-1,1), (1,-1))
+    ];
+
+    let puzzle = Puzzle::new(input, 'A');
+
+    let mut res: u32 = 0;
+
+    // for each 'A' search for 'MS' around it and add 1 if found
+    for (r, c) in puzzle.x_pos {
+        let (r, c) = (r as i32, c as i32);
+        if is_mas((r,c), dir[0], &puzzle.map) && is_mas((r,c), dir[1], &puzzle.map) {
+            res += 1;
+        }
+    }
+
+    Ok(res)
 }
 
 #[cfg(test)]
@@ -111,6 +140,22 @@ SAXAMASAAA
 MAMMMXMMMM
 MXMXAXMASX";
 
+    static TEXT_INPUT_3: &str = "\
+M.S
+.A.
+M.S";
+    static TEXT_INPUT_4: &str = "\
+.M.S......
+..A..MSMS.
+.M.S.MAA..
+..A.ASMSM.
+.M.S.M....
+..........
+S.S.S.S.S.
+.A.A.A.A..
+M.M.M.M.M.
+..........";
+
     #[test]
     fn test_part1() {
         assert_eq!(4, run_part1(TEXT_INPUT_1).unwrap());
@@ -119,6 +164,7 @@ MXMXAXMASX";
 
     #[test]
     fn test_part2() {
-        assert_eq!(0, run_part2(TEXT_INPUT_2).unwrap());
+        assert_eq!(1, run_part2(TEXT_INPUT_3).unwrap());
+        assert_eq!(9, run_part2(TEXT_INPUT_4).unwrap());
     }
 }