1
0
Fork 0

Extract common method Vec2::max

This commit is contained in:
Lars Martens 2023-12-11 13:05:31 +01:00
parent c6c6a234c0
commit 82e0348158
Signed by: haselkern
GPG key ID: B5CF1F363C179AD4
3 changed files with 22 additions and 12 deletions

View file

@ -67,10 +67,7 @@ impl Maze {
/// Count the number of tiles inside the polygon described by the pipe loop /// Count the number of tiles inside the polygon described by the pipe loop
/// using the [winding number algorithm](https://en.wikipedia.org/wiki/Point_in_polygon#Winding_number_algorithm). /// using the [winding number algorithm](https://en.wikipedia.org/wiki/Point_in_polygon#Winding_number_algorithm).
fn count_empty_tiles_inside(&self) -> usize { fn count_empty_tiles_inside(&self) -> usize {
let max_dimensions = self.tiles.keys().fold(Vec2::<i64>::default(), |a, b| Vec2 { let max_dimensions = self.tiles.keys().copied().reduce(Vec2::max).unwrap();
x: a.x.max(b.x),
y: a.y.max(b.y),
});
let pipe_loop = self.pipe_loop(); let pipe_loop = self.pipe_loop();
let mut tiles_inside = 0; let mut tiles_inside = 0;

View file

@ -31,7 +31,7 @@ struct Universe {
impl Universe { impl Universe {
fn expand(&mut self, factor: usize) { fn expand(&mut self, factor: usize) {
let add = factor - 1; let add = factor - 1;
let dimensions = self.dimensions(); let dimensions = self.galaxies.iter().copied().reduce(Vec2::max).unwrap();
// Add additional columns // Add additional columns
for x in (0..=dimensions.x).rev() { for x in (0..=dimensions.x).rev() {
@ -60,13 +60,6 @@ impl Universe {
} }
} }
fn dimensions(&self) -> Galaxy {
self.galaxies.iter().fold(Galaxy::default(), |a, b| Galaxy {
x: a.x.max(b.x),
y: a.y.max(b.y),
})
}
fn sum_of_distances(&self) -> usize { fn sum_of_distances(&self) -> usize {
let pairs = self let pairs = self
.galaxies .galaxies

View file

@ -121,6 +121,26 @@ impl<T> Vec2<T> {
} }
} }
impl<T> Vec2<T>
where
T: Ord,
{
/// Returns the component-wise maximum of this vector and the other.
///
/// ```rust
/// # use aoc2023::Vec2;
/// let a = Vec2::new(1, 5);
/// let b = Vec2::new(2, -5);
/// assert_eq!(a.max(b), Vec2::new(2, 5));
/// ```
pub fn max(self, other: Self) -> Self {
Self {
x: self.x.max(other.x),
y: self.y.max(other.y),
}
}
}
impl<T> Add for Vec2<T> impl<T> Add for Vec2<T>
where where
T: Add<Output = T>, T: Add<Output = T>,