summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-08 01:09:33 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-08 01:09:33 -0500
commitc44b43f33e0e4fedb38ea490cff9f357079e9c12 (patch)
tree4d8ac59bcfa7c84f45091a1e29d8e78d3efc2e9b
parent335dfe990b043e6695a0bb463694cf4dfc44f17a (diff)
downloadadvent-of-code-c44b43f33e0e4fedb38ea490cff9f357079e9c12.tar.gz
advent-of-code-c44b43f33e0e4fedb38ea490cff9f357079e9c12.zip
simplify
-rw-r--r--src/2022/8/mod.rs50
-rw-r--r--src/grid.rs14
2 files changed, 46 insertions, 18 deletions
diff --git a/src/2022/8/mod.rs b/src/2022/8/mod.rs
index 59f561c..49df9dd 100644
--- a/src/2022/8/mod.rs
+++ b/src/2022/8/mod.rs
@@ -9,27 +9,37 @@ pub fn parse(fh: File) -> Result<Grid<u8>> {
pub fn part1(trees: Grid<u8>) -> Result<i64> {
let mut total = 0;
- for row in (0..trees.rows().0).map(Row) {
- 'tree: for col in (0..trees.cols().0).map(Col) {
+ for row in trees.each_row() {
+ 'tree: for col in trees.each_col() {
let tree = trees[row][col];
- if (0..col.0).map(Col).all(|col| trees[row][col] < tree) {
+ if trees
+ .each_col()
+ .take(col.0)
+ .all(|col| trees[row][col] < tree)
+ {
total += 1;
continue 'tree;
}
- if ((col.0 + 1)..trees.cols().0)
- .map(Col)
+ if trees
+ .each_col()
+ .skip(col.0 + 1)
.all(|col| trees[row][col] < tree)
{
total += 1;
continue 'tree;
}
- if (0..row.0).map(Row).all(|row| trees[row][col] < tree) {
+ if trees
+ .each_row()
+ .take(row.0)
+ .all(|row| trees[row][col] < tree)
+ {
total += 1;
continue 'tree;
}
- if ((row.0 + 1)..trees.rows().0)
- .map(Row)
+ if trees
+ .each_row()
+ .skip(row.0 + 1)
.all(|row| trees[row][col] < tree)
{
total += 1;
@@ -42,13 +52,14 @@ pub fn part1(trees: Grid<u8>) -> Result<i64> {
pub fn part2(trees: Grid<u8>) -> Result<i64> {
let mut max = 0;
- for row in (0..trees.rows().0).map(Row) {
- for col in (0..trees.cols().0).map(Col) {
+ for row in trees.each_row() {
+ for col in trees.each_col() {
let tree = trees[row][col];
let mut seen = false;
- let left = (0..col.0)
- .map(Col)
+ let left = trees
+ .each_col()
+ .take(col.0)
.rev()
.take_while(|col| {
if seen {
@@ -66,8 +77,9 @@ pub fn part2(trees: Grid<u8>) -> Result<i64> {
.count();
let mut seen = false;
- let right = ((col.0 + 1)..trees.cols().0)
- .map(Col)
+ let right = trees
+ .each_col()
+ .skip(col.0 + 1)
.take_while(|col| {
if seen {
return false;
@@ -84,8 +96,9 @@ pub fn part2(trees: Grid<u8>) -> Result<i64> {
.count();
let mut seen = false;
- let up = (0..row.0)
- .map(Row)
+ let up = trees
+ .each_row()
+ .take(row.0)
.rev()
.take_while(|row| {
if seen {
@@ -103,8 +116,9 @@ pub fn part2(trees: Grid<u8>) -> Result<i64> {
.count();
let mut seen = false;
- let down = ((row.0 + 1)..trees.rows().0)
- .map(Row)
+ let down = trees
+ .each_row()
+ .skip(row.0 + 1)
.take_while(|row| {
if seen {
return false;
diff --git a/src/grid.rs b/src/grid.rs
index b84e1b7..f360932 100644
--- a/src/grid.rs
+++ b/src/grid.rs
@@ -110,10 +110,24 @@ impl<T: Default + Clone + Eq + PartialEq> Grid<T> {
Row(self.rows.len())
}
+ pub fn each_row(
+ &self,
+ ) -> impl Iterator<Item = Row> + DoubleEndedIterator + ExactSizeIterator
+ {
+ (0..self.rows().0).map(Row)
+ }
+
pub fn cols(&self) -> Col {
Col(self.rows[0].cells.len())
}
+ pub fn each_col(
+ &self,
+ ) -> impl Iterator<Item = Col> + DoubleEndedIterator + ExactSizeIterator
+ {
+ (0..self.cols().0).map(Col)
+ }
+
pub fn get(&self, row: Row) -> Option<&GridRow<T>> {
self.rows.get(row.0)
}