From bf5747e9925988c8cf053f974fdcc35ca76df361 Mon Sep 17 00:00:00 2001 From: Gard Spreemann Date: Sun, 11 Dec 2022 16:14:28 +0100 Subject: Days 8 and 9 --- 08/src/part-1.rs | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 08/src/part-1.rs (limited to '08/src/part-1.rs') 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); +} -- cgit v1.2.3