day 8
parent
3b88057214
commit
474ad0a248
@ -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…
Reference in New Issue