master
george 2 years ago
parent 3b88057214
commit 474ad0a248

7
day08/Cargo.lock generated

@ -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"

@ -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]

@ -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::<Vec<usize>>()
})
.collect::<Vec<Vec<usize>>>();
let mut cols: Vec<Vec<usize>> = 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
}

@ -0,0 +1,5 @@
30373
25512
65332
33549
35390
Loading…
Cancel
Save