Skip to content

Commit 8f65fcc

Browse files
committed
refactor(08/2024): remove duplications
1 parent efb9117 commit 8f65fcc

File tree

1 file changed

+21
-33
lines changed

1 file changed

+21
-33
lines changed

src/solutions/year2024/day08.rs

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,20 @@ pub struct Day08;
88

99
impl 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

Comments
 (0)