From: alex <> Date: Wed, 4 Dec 2024 09:20:10 +0000 (+0100) Subject: Day04 - part 2 X-Git-Url: https://aoc.elinar.fr/?a=commitdiff_plain;h=2146872e8d380ed71bce9de12ddcebc2f21e1cae;p=aoc_2024 Day04 - part 2 --- diff --git a/src/day04.rs b/src/day04.rs index c885a7a..f68472f 100644 --- a/src/day04.rs +++ b/src/day04.rs @@ -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> = 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> { (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> { fn run_part2(input: &str) -> Result> { println!("Running {} - part 2", get_day()); - Ok(0) + fn is_mas(coord: (i32, i32), dir: ((i32, i32), (i32, i32)), map: &Vec>) -> 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()); } }