2
2
// │ Advent of Code 2024 - Day 4 │
3
3
// ╰─────────────────────────────────────────────────────────╯
4
4
5
- use glam:: { ivec2, IVec2 } ;
5
+ use glam:: { ivec2, IVec2 } ;
6
6
7
7
fn main ( ) {
8
8
// ── Part 1 ──────────────────────────────────────────────────────────
9
9
let input = include_str ! ( "../input.txt" ) ;
10
10
11
- let map = input. lines ( ) . map ( |line| line. chars ( ) . collect :: < Vec < _ > > ( ) ) . collect :: < Vec < _ > > ( ) ;
11
+ let map = input
12
+ . lines ( )
13
+ . map ( |line| line. chars ( ) . collect :: < Vec < _ > > ( ) )
14
+ . collect :: < Vec < _ > > ( ) ;
12
15
13
- let result_xmas = map. iter ( ) . enumerate ( ) . map ( |( y, line) | {
14
- line. iter ( ) . enumerate ( ) . filter_map ( |( x, c) | if * c == 'X' { Some ( ivec2 ( x as i32 , y as i32 ) ) } else { None } ) . map ( |x_vec| {
15
- count_xmas ( & map, x_vec)
16
- } ) . sum :: < usize > ( )
17
- } ) . sum :: < usize > ( ) ;
16
+ let result_xmas = map
17
+ . iter ( )
18
+ . enumerate ( )
19
+ . map ( |( y, line) | {
20
+ line. iter ( )
21
+ . enumerate ( )
22
+ . filter_map ( |( x, c) | {
23
+ if * c == 'X' {
24
+ Some ( ivec2 ( x as i32 , y as i32 ) )
25
+ } else {
26
+ None
27
+ }
28
+ } )
29
+ . map ( |x_vec| count_xmas ( & map, x_vec) )
30
+ . sum :: < usize > ( )
31
+ } )
32
+ . sum :: < usize > ( ) ;
18
33
19
34
println ! ( "Number of XMAS: {result_xmas}" ) ;
20
35
21
36
// ── Part 2 ──────────────────────────────────────────────────────────
22
- let result_mas = map. iter ( ) . enumerate ( ) . map ( |( y, line) | {
23
- line. iter ( ) . enumerate ( ) . filter_map ( |( x, c) | if * c == 'A' { Some ( ivec2 ( x as i32 , y as i32 ) ) } else { None } ) . filter ( |a_vec| {
24
- count_mas ( & map, * a_vec)
25
- } ) . count ( )
26
- } ) . sum :: < usize > ( ) ;
37
+ let result_mas = map
38
+ . iter ( )
39
+ . enumerate ( )
40
+ . map ( |( y, line) | {
41
+ line. iter ( )
42
+ . enumerate ( )
43
+ . filter_map ( |( x, c) | {
44
+ if * c == 'A' {
45
+ Some ( ivec2 ( x as i32 , y as i32 ) )
46
+ } else {
47
+ None
48
+ }
49
+ } )
50
+ . filter ( |a_vec| count_mas ( & map, * a_vec) )
51
+ . count ( )
52
+ } )
53
+ . sum :: < usize > ( ) ;
27
54
28
55
println ! ( "Number of X-MAS: {result_mas}" ) ;
29
56
}
@@ -34,12 +61,11 @@ fn count_mas(map: &Vec<Vec<char>>, a_vec: IVec2) -> bool {
34
61
let bottom_left = a_vec + ivec2 ( -1 , 1 ) ;
35
62
let bottom_right = a_vec + ivec2 ( 1 , 1 ) ;
36
63
37
- if !(
38
- is_in_bounds ( map, top_left)
64
+ if !( is_in_bounds ( map, top_left)
39
65
&& is_in_bounds ( map, top_right)
40
66
&& is_in_bounds ( map, bottom_left)
41
- && is_in_bounds ( map, bottom_right)
42
- ) {
67
+ && is_in_bounds ( map, bottom_right) )
68
+ {
43
69
return false ;
44
70
}
45
71
@@ -48,26 +74,46 @@ fn count_mas(map: &Vec<Vec<char>>, a_vec: IVec2) -> bool {
48
74
let bottom_left_char = get_in_map ( map, bottom_left) ;
49
75
let bottom_right_char = get_in_map ( map, bottom_right) ;
50
76
51
- top_left_char == 'M' && bottom_right_char == 'S' && top_right_char == 'S' && bottom_left_char == 'M'
52
- || top_left_char == 'M' && bottom_right_char == 'S' && top_right_char == 'M' && bottom_left_char == 'S'
53
- || top_left_char == 'S' && bottom_right_char == 'M' && top_right_char == 'M' && bottom_left_char == 'S'
54
- || top_left_char == 'S' && bottom_right_char == 'M' && top_right_char == 'S' && bottom_left_char == 'M'
77
+ top_left_char == 'M'
78
+ && bottom_right_char == 'S'
79
+ && top_right_char == 'S'
80
+ && bottom_left_char == 'M'
81
+ || top_left_char == 'M'
82
+ && bottom_right_char == 'S'
83
+ && top_right_char == 'M'
84
+ && bottom_left_char == 'S'
85
+ || top_left_char == 'S'
86
+ && bottom_right_char == 'M'
87
+ && top_right_char == 'M'
88
+ && bottom_left_char == 'S'
89
+ || top_left_char == 'S'
90
+ && bottom_right_char == 'M'
91
+ && top_right_char == 'S'
92
+ && bottom_left_char == 'M'
55
93
}
56
94
57
95
fn count_xmas ( map : & Vec < Vec < char > > , x_vec : IVec2 ) -> usize {
58
96
const DIRECTIONS : [ IVec2 ; 8 ] = [
59
- ivec2 ( -1 , -1 ) , ivec2 ( 0 , -1 ) , ivec2 ( 1 , -1 ) ,
60
- ivec2 ( -1 , 0 ) , ivec2 ( 1 , 0 ) ,
61
- ivec2 ( -1 , 1 ) , ivec2 ( 0 , 1 ) , ivec2 ( 1 , 1 )
97
+ ivec2 ( -1 , -1 ) ,
98
+ ivec2 ( 0 , -1 ) ,
99
+ ivec2 ( 1 , -1 ) ,
100
+ ivec2 ( -1 , 0 ) ,
101
+ ivec2 ( 1 , 0 ) ,
102
+ ivec2 ( -1 , 1 ) ,
103
+ ivec2 ( 0 , 1 ) ,
104
+ ivec2 ( 1 , 1 ) ,
62
105
] ;
63
106
64
- DIRECTIONS . iter ( ) . filter ( |& & direction| {
65
- let s = x_vec + 3 * direction;
66
- is_in_bounds ( map, s)
67
- && get_in_map ( map, x_vec + direction) == 'M'
68
- && get_in_map ( map, x_vec + 2 * direction) == 'A'
69
- && get_in_map ( map, s) == 'S'
70
- } ) . count ( )
107
+ DIRECTIONS
108
+ . iter ( )
109
+ . filter ( |& & direction| {
110
+ let s = x_vec + 3 * direction;
111
+ is_in_bounds ( map, s)
112
+ && get_in_map ( map, x_vec + direction) == 'M'
113
+ && get_in_map ( map, x_vec + 2 * direction) == 'A'
114
+ && get_in_map ( map, s) == 'S'
115
+ } )
116
+ . count ( )
71
117
}
72
118
73
119
fn get_in_map ( map : & Vec < Vec < char > > , pos : IVec2 ) -> char {
0 commit comments