}
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 + ".";
.for_each(|(r, row)| {
row.iter().enumerate()
.for_each(|(c, v)| {
- if *v == 'X' {
+ if *v == x_char {
x_pos.push((r, c));
}
});
(1,0), (1,-1), (0,-1), (-1,-1),
];
- let puzzle = Puzzle::new(input);
+ let puzzle = Puzzle::new(input, 'X');
let mut res: u32 = 0;
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)]
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());
#[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());
}
}