summaryrefslogtreecommitdiff
path: root/08/src/part-1.rs
diff options
context:
space:
mode:
Diffstat (limited to '08/src/part-1.rs')
-rw-r--r--08/src/part-1.rs91
1 files changed, 91 insertions, 0 deletions
diff --git a/08/src/part-1.rs b/08/src/part-1.rs
new file mode 100644
index 0000000..1bbd75a
--- /dev/null
+++ b/08/src/part-1.rs
@@ -0,0 +1,91 @@
+mod tensor;
+
+use std::io::{BufRead};
+
+use tensor::{Index, Shape, Tensor};
+
+fn main() {
+ let stdin = std::io::stdin();
+ let mut handle = stdin.lock();
+
+ let mut tmp: Vec<(i8, bool)> = Vec::new();
+ let mut m: usize = 0;
+ let mut n: usize = 0;
+ let mut n_check: usize = 0;
+
+ loop {
+ let buf = handle.fill_buf().expect("IO error");
+ let bytes_read = buf.len();
+ if bytes_read == 0 { break; }
+
+ for & b in buf.into_iter() {
+ if b >= b'0' && b <= b'9' {
+ tmp.push(((b - b'0').try_into().unwrap(), false));
+ if m == 0 {
+ n += 1;
+ }
+ n_check += 1;
+ }
+ if b == b'\n' {
+ m += 1;
+ assert_eq!(n_check, n);
+ n_check = 0;
+ }
+ }
+
+ handle.consume(bytes_read);
+ }
+
+ let mut x: Tensor<(i8, bool), 2> = Tensor::new_from([m, n], tmp);
+ let shape = x.shape().clone();
+ let mut tallest: i8;
+
+ // Look north-south.
+ for j in 0..shape[1] {
+ // Look from north.
+ tallest = -1;
+ for i in 0..shape[0] {
+ let tree = &mut x[[i, j]];
+ if tree.0 > tallest {
+ tree.1 = true;
+ tallest = tree.0;
+ }
+ }
+
+ // Look from south.
+ tallest = -1;
+ for i in (0..shape[0]).rev() {
+ let tree = &mut x[[i, j]];
+ if tree.0 > tallest {
+ tree.1 = true;
+ tallest = tree.0;
+ }
+ }
+ }
+
+ // Look east-west.
+ for i in 0..shape[0] {
+ // Look from west.
+ tallest = -1;
+ for j in 0..shape[1] {
+ let tree = &mut x[[i, j]];
+ if tree.0 > tallest {
+ tree.1 = true;
+ tallest = tree.0;
+ }
+ }
+
+ // Look from east.
+ tallest = -1;
+ for j in (0..shape[1]).rev() {
+ let tree = &mut x[[i, j]];
+ if tree.0 > tallest {
+ tree.1 = true;
+ tallest = tree.0;
+ }
+ }
+ }
+
+ let num_visible = x.data().into_iter().filter(|(_, vis)| *vis).count();
+ println!("{}", num_visible);
+}