1+ use mygrid:: {
2+ direction:: { ALL_AROUND , DOWN , LEFT , RIGHT , UP } ,
3+ grid:: Grid ,
4+ } ;
5+
16advent_of_code:: solution!( 4 ) ;
27
38pub fn part_one ( input : & str ) -> Option < u32 > {
4- None
9+ let grid = Grid :: new_from_str ( input, |c| c) ;
10+
11+ let res = grid
12+ . iter_item_and_position ( )
13+ . flat_map ( |( point, & c) | ALL_AROUND . iter ( ) . map ( move |d| ( point, c, * d) ) )
14+ . filter ( |& ( _, c, _) | c == 'X' )
15+ . filter ( |& ( point, _, d) | grid. is_in_bounds ( point + ( d * 3 ) ) )
16+ . filter ( |& ( point, _, d) | {
17+ let x_pos = point;
18+ let m_pos = x_pos + d;
19+ let a_pos = m_pos + d;
20+ let s_pos = a_pos + d;
21+ let spells_xmas = grid[ x_pos] == 'X'
22+ && grid[ m_pos] == 'M'
23+ && grid[ a_pos] == 'A'
24+ && grid[ s_pos] == 'S' ;
25+
26+ spells_xmas
27+ } )
28+ . count ( ) ;
29+
30+ Some ( res as u32 )
531}
632
733pub fn part_two ( input : & str ) -> Option < u32 > {
8- None
34+ let grid = Grid :: new_from_str ( input, |c| c) ;
35+
36+ let res = grid
37+ . iter_item_and_position ( )
38+ . filter ( |& ( _, & c) | c == 'A' )
39+ . filter ( |& ( point, _) | {
40+ let ( Some ( & top_left) , Some ( & top_right) , Some ( & bot_left) , Some ( & bot_right) ) = (
41+ grid. get_item ( point + UP + LEFT ) ,
42+ grid. get_item ( point + UP + RIGHT ) ,
43+ grid. get_item ( point + DOWN + LEFT ) ,
44+ grid. get_item ( point + DOWN + RIGHT ) ,
45+ ) else {
46+ return false ;
47+ } ;
48+
49+ let spells_xmas_diag1 =
50+ ( top_left == 'M' && bot_right == 'S' ) || ( top_left == 'S' && bot_right == 'M' ) ;
51+ let spells_xmas_diag2 =
52+ ( top_right == 'M' && bot_left == 'S' ) || ( top_right == 'S' && bot_left == 'M' ) ;
53+ spells_xmas_diag1 && spells_xmas_diag2
54+ } )
55+ . count ( ) ;
56+
57+ Some ( res as u32 )
958}
1059
1160#[ cfg( test) ]
@@ -15,12 +64,12 @@ mod tests {
1564 #[ test]
1665 fn test_part_one ( ) {
1766 let result = part_one ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
18- assert_eq ! ( result, None ) ;
67+ assert_eq ! ( result, Some ( 18 ) ) ;
1968 }
2069
2170 #[ test]
2271 fn test_part_two ( ) {
2372 let result = part_two ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
24- assert_eq ! ( result, None ) ;
73+ assert_eq ! ( result, Some ( 9 ) ) ;
2574 }
2675}
0 commit comments