@@ -8,25 +8,20 @@ pub struct Day08;
88
99impl Solution for Day08 {
1010 fn part_one ( & self , input : & str ) -> String {
11- let grid: Grid < char > = Grid :: from ( input) ;
12- let surface_range = grid. surface_range ( ) ;
13-
14- grid. elements_with_points ( )
15- . iter ( )
16- . filter ( |( element, _) | * * element != '.' )
17- . flat_map ( |( _, points) | {
18- points
19- . iter ( )
20- . combinations ( 2 )
21- . flat_map ( |pair| self . antinodes_part_one ( * pair[ 0 ] , * pair[ 1 ] , & surface_range) )
22- . collect :: < Vec < Point > > ( )
23- } )
24- . unique ( )
25- . count ( )
26- . to_string ( )
11+ self . solve_generic ( input, Self :: antinodes_part_one)
2712 }
2813
2914 fn part_two ( & self , input : & str ) -> String {
15+ self . solve_generic ( input, Self :: antinodes_part_two)
16+ }
17+ }
18+
19+ impl Day08 {
20+ fn solve_generic (
21+ & self ,
22+ input : & str ,
23+ solve_fn : fn ( Point , Point , & SurfaceRange ) -> Vec < Point > ,
24+ ) -> String {
3025 let grid: Grid < char > = Grid :: from ( input) ;
3126 let surface_range = grid. surface_range ( ) ;
3227
@@ -37,17 +32,15 @@ impl Solution for Day08 {
3732 points
3833 . iter ( )
3934 . combinations ( 2 )
40- . flat_map ( |pair| self . antinodes_part_two ( * pair[ 0 ] , * pair[ 1 ] , & surface_range) )
35+ . flat_map ( |pair| solve_fn ( * pair[ 0 ] , * pair[ 1 ] , & surface_range) )
4136 . collect :: < Vec < Point > > ( )
4237 } )
4338 . unique ( )
4439 . count ( )
4540 . to_string ( )
4641 }
47- }
4842
49- impl Day08 {
50- fn antinodes_part_one ( & self , p1 : Point , p2 : Point , surface_range : & SurfaceRange ) -> Vec < Point > {
43+ fn antinodes_part_one ( p1 : Point , p2 : Point , surface_range : & SurfaceRange ) -> Vec < Point > {
5144 let diff = p1 - p2;
5245
5346 vec ! [ p1 + diff, p1 - diff, p2 + diff, p2 - diff]
@@ -57,23 +50,18 @@ impl Day08 {
5750 . collect ( )
5851 }
5952
60- fn antinodes_part_two ( & self , p1 : Point , p2 : Point , surface_range : & SurfaceRange ) -> Vec < Point > {
53+ fn antinodes_part_two ( p1 : Point , p2 : Point , surface_range : & SurfaceRange ) -> Vec < Point > {
6154 let diff = p1 - p2;
6255
63- let first = self . antipodes_in_dir ( p1, diff, surface_range) ;
64- let second = self . antipodes_in_dir ( p2, -diff, surface_range) ;
56+ let first = Self :: antinodes_in_dir ( p1, diff, surface_range) ;
57+ let second = Self :: antinodes_in_dir ( p2, -diff, surface_range) ;
6558
6659 let vec = concat ( vec ! [ first, second] ) ;
6760
6861 vec. into_iter ( ) . unique ( ) . collect ( )
6962 }
7063
71- fn antipodes_in_dir (
72- & self ,
73- point : Point ,
74- diff : Point ,
75- surface_range : & SurfaceRange ,
76- ) -> Vec < Point > {
64+ fn antinodes_in_dir ( point : Point , diff : Point , surface_range : & SurfaceRange ) -> Vec < Point > {
7765 let mut vec = Vec :: new ( ) ;
7866 let mut current = point;
7967
@@ -135,7 +123,7 @@ mod tests {
135123
136124 let ( p1, p2) = elements. get ( & 'a' ) . unwrap ( ) . iter ( ) . collect_tuple ( ) . unwrap ( ) ;
137125
138- let mut result = Day08 . antinodes_part_one ( * p1, * p2, & grid. surface_range ( ) ) ;
126+ let mut result = Day08 :: antinodes_part_one ( * p1, * p2, & grid. surface_range ( ) ) ;
139127 let mut expected = elements. get ( & '#' ) . unwrap ( ) . to_vec ( ) ;
140128
141129 result. sort ( ) ;
@@ -162,9 +150,9 @@ mod tests {
162150
163151 let ( p1, p2, p3) = elements. get ( & 'T' ) . unwrap ( ) . iter ( ) . collect_tuple ( ) . unwrap ( ) ;
164152
165- let result1 = Day08 . antinodes_part_two ( * p1, * p2, & grid. surface_range ( ) ) ;
166- let result2 = Day08 . antinodes_part_two ( * p1, * p3, & grid. surface_range ( ) ) ;
167- let result3 = Day08 . antinodes_part_two ( * p2, * p3, & grid. surface_range ( ) ) ;
153+ let result1 = Day08 :: antinodes_part_two ( * p1, * p2, & grid. surface_range ( ) ) ;
154+ let result2 = Day08 :: antinodes_part_two ( * p1, * p3, & grid. surface_range ( ) ) ;
155+ let result3 = Day08 :: antinodes_part_two ( * p2, * p3, & grid. surface_range ( ) ) ;
168156
169157 let result = concat ( vec ! [ result1, result2, result3] )
170158 . iter ( )
0 commit comments