summaryrefslogtreecommitdiffstats
path: root/src/bin/2022/day8.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/2022/day8.rs')
-rw-r--r--src/bin/2022/day8.rs156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/bin/2022/day8.rs b/src/bin/2022/day8.rs
new file mode 100644
index 0000000..6ec110e
--- /dev/null
+++ b/src/bin/2022/day8.rs
@@ -0,0 +1,156 @@
+#![allow(dead_code)]
+#![allow(unused_variables)]
+
+use advent_of_code::prelude::*;
+
+pub fn parse(fh: File) -> Result<Grid<u8>> {
+ Ok(parse::digit_grid(parse::raw_lines(fh)))
+}
+
+pub fn part1(trees: Grid<u8>) -> Result<u64> {
+ let mut total = 0;
+ for row in trees.each_row() {
+ 'tree: for col in trees.each_col() {
+ let tree = trees[row][col];
+
+ if trees
+ .each_col()
+ .take(col.0)
+ .all(|col| trees[row][col] < tree)
+ {
+ total += 1;
+ continue 'tree;
+ }
+ if trees
+ .each_col()
+ .skip(col.0 + 1)
+ .all(|col| trees[row][col] < tree)
+ {
+ total += 1;
+ continue 'tree;
+ }
+ if trees
+ .each_row()
+ .take(row.0)
+ .all(|row| trees[row][col] < tree)
+ {
+ total += 1;
+ continue 'tree;
+ }
+ if trees
+ .each_row()
+ .skip(row.0 + 1)
+ .all(|row| trees[row][col] < tree)
+ {
+ total += 1;
+ continue 'tree;
+ }
+ }
+ }
+ Ok(total)
+}
+
+pub fn part2(trees: Grid<u8>) -> Result<usize> {
+ let mut max = 0;
+ for row in trees.each_row() {
+ for col in trees.each_col() {
+ let tree = trees[row][col];
+
+ let mut seen = false;
+ let left = trees
+ .each_col()
+ .take(col.0)
+ .rev()
+ .take_while(|col| {
+ if seen {
+ return false;
+ }
+
+ let other = trees[row][*col];
+ if other < tree {
+ true
+ } else {
+ seen = true;
+ true
+ }
+ })
+ .count();
+
+ let mut seen = false;
+ let right = trees
+ .each_col()
+ .skip(col.0 + 1)
+ .take_while(|col| {
+ if seen {
+ return false;
+ }
+
+ let other = trees[row][*col];
+ if other < tree {
+ true
+ } else {
+ seen = true;
+ true
+ }
+ })
+ .count();
+
+ let mut seen = false;
+ let up = trees
+ .each_row()
+ .take(row.0)
+ .rev()
+ .take_while(|row| {
+ if seen {
+ return false;
+ }
+
+ let other = trees[*row][col];
+ if other < tree {
+ true
+ } else {
+ seen = true;
+ true
+ }
+ })
+ .count();
+
+ let mut seen = false;
+ let down = trees
+ .each_row()
+ .skip(row.0 + 1)
+ .take_while(|row| {
+ if seen {
+ return false;
+ }
+
+ let other = trees[*row][col];
+ if other < tree {
+ true
+ } else {
+ seen = true;
+ true
+ }
+ })
+ .count();
+
+ let scenic = left * right * up * down;
+ if scenic > max {
+ max = scenic;
+ }
+ }
+ }
+ Ok(max)
+}
+
+#[test]
+fn test() {
+ assert_eq!(
+ part1(parse(parse::data(2022, 8).unwrap()).unwrap()).unwrap(),
+ 1851
+ );
+ assert_eq!(
+ part2(parse(parse::data(2022, 8).unwrap()).unwrap()).unwrap(),
+ 574080
+ );
+}