diff --git a/day08/Cargo.lock b/day08/Cargo.lock new file mode 100644 index 0000000..1d4626c --- /dev/null +++ b/day08/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day08" +version = "0.1.0" diff --git a/day08/Cargo.toml b/day08/Cargo.toml new file mode 100644 index 0000000..7156aba --- /dev/null +++ b/day08/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day08" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/day08/src/main.rs b/day08/src/main.rs new file mode 100644 index 0000000..fcbb621 --- /dev/null +++ b/day08/src/main.rs @@ -0,0 +1,83 @@ +fn main() { + let f = std::fs::read_to_string("/dev/stdin").unwrap(); + let rows = f + .lines() + .map(|c| { + c.chars() + .map(|c| c.to_digit(10).unwrap() as usize) + .collect::>() + }) + .collect::>>(); + + let mut cols: Vec> = Vec::new(); + for i in 0..rows.len() { + let mut col = Vec::new(); + for j in 0..rows.len() { + col.push(*rows.get(j).unwrap().get(i).unwrap()); + } + cols.push(col); + } + + let mut total_visible = 0; + let mut scenic_score = 0; + + for (row_num, row) in rows.iter().enumerate() { + if row_num == 0 { + total_visible += (row.len() - 1) * 4; // perimeter + continue; + } + if row_num == rows.len() - 1 { + break; + } + + for (col_num, col) in row.get(0..row.len() - 1).unwrap().iter().enumerate() { + if col_num == 0 { + continue; + } + let before_row = row.get(0..col_num).unwrap(); + let after_row = row.get(col_num + 1..).unwrap(); + let this_col = cols.get(col_num).unwrap(); + let before_col = this_col.get(0..row_num).unwrap(); + let after_col = this_col.get(row_num + 1..).unwrap(); + + let visible_before = get_viewing_distance(*col, before_row, true); + let visible_after = get_viewing_distance(*col, after_row, false); + let visible_above = get_viewing_distance(*col, before_col, true); + let visible_below = get_viewing_distance(*col, after_col, false); + let score = visible_before * visible_after * visible_above * visible_below; + if score > scenic_score { + scenic_score = score; + } + + if before_row.iter().filter(|t| t >= &col).count() == 0 + || after_row.iter().filter(|t| t >= &col).count() == 0 + || before_col.iter().filter(|t| t >= &col).count() == 0 + || after_col.iter().filter(|t| t >= &col).count() == 0 + { + total_visible += 1; + } + } + } + + println!("{}, {}", total_visible, scenic_score); +} + +fn get_viewing_distance(height: usize, view: &[usize], reverse_order: bool) -> usize { + let mut visible = 0; + if reverse_order { + for tree in view.iter().rev() { + visible += 1; + if tree >= &height { + break; + } + } + } else { + for tree in view { + visible += 1; + if tree >= &height { + break; + } + } + } + visible +} diff --git a/day08/test b/day08/test new file mode 100644 index 0000000..16d6fbd --- /dev/null +++ b/day08/test @@ -0,0 +1,5 @@ +30373 +25512 +65332 +33549 +35390