1
0
Fork 0

Added Day 5 Part 2

This commit is contained in:
Ishan Jain 2021-12-06 01:14:31 +05:30
parent 2fa5b3de29
commit 7b889c19c9
1 changed files with 36 additions and 13 deletions

View File

@ -15,19 +15,26 @@ struct LineSegment {
} }
impl LineSegment { impl LineSegment {
fn generate_points(&self) -> Vec<(usize, usize)> { fn generate_y_points(&self) -> impl Iterator<Item = (usize, usize)> + '_ {
if self.x1 == self.x2 { let ymin = std::cmp::min(self.y1, self.y2);
let ymin = std::cmp::min(self.y1, self.y2); let ymax = std::cmp::max(self.y1, self.y2);
let ymax = std::cmp::max(self.y1, self.y2);
return (ymin..=ymax).map(|y| (self.x1, y)).collect(); (ymin..=ymax).map(|y| (self.x1, y))
} else if self.y1 == self.y2 { }
let xmin = std::cmp::min(self.x1, self.x2);
let xmax = std::cmp::max(self.x1, self.x2);
return (xmin..=xmax).map(|x| (x, self.y1)).collect(); fn generate_x_points(&self) -> impl Iterator<Item = (usize, usize)> + '_ {
} else { let xmin = std::cmp::min(self.x1, self.x2);
vec![] let xmax = std::cmp::max(self.x1, self.x2);
(xmin..=xmax).map(|x| (x, self.y1))
}
fn generate_diag_points(&self) -> Vec<(usize, usize)> {
match (self.x2 >= self.x1, self.y2 >= self.y1) {
(true, true) => (self.x1..=self.x2).zip(self.y1..=self.y2).collect(),
(true, false) => (self.x1..=self.x2).zip((self.y2..=self.y1).rev()).collect(),
(false, true) => ((self.x2..=self.x1).rev()).zip(self.y1..=self.y2).collect(),
(false, false) => (self.x2..=self.x1).zip(self.y2..=self.y1).collect(),
} }
} }
} }
@ -66,8 +73,24 @@ fn solution(coords: Vec<LineSegment>) -> u64 {
let mut grid = vec![vec![0; 1000]; 1000]; let mut grid = vec![vec![0; 1000]; 1000];
for coord in coords { for coord in coords {
for (x, y) in coord.generate_points() { if coord.x1 == coord.x2 {
grid[x][y] += 1; for (x, y) in coord.generate_y_points() {
unsafe {
*grid.get_unchecked_mut(x).get_unchecked_mut(y) += 1;
}
}
} else if coord.y1 == coord.y2 {
for (x, y) in coord.generate_x_points() {
unsafe {
*grid.get_unchecked_mut(x).get_unchecked_mut(y) += 1;
}
}
} else {
for (x, y) in coord.generate_diag_points() {
unsafe {
*grid.get_unchecked_mut(x).get_unchecked_mut(y) += 1;
}
}
} }
} }