-
Notifications
You must be signed in to change notification settings - Fork 0
/
day_8.rs
97 lines (82 loc) · 3.22 KB
/
day_8.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
pub fn run() {
let input_str = include_str!("../../inputs/input_8.txt");
// split input into vector of vectors of numbers
let input: Vec<Vec<u32>> = input_str
.lines()
.map(|s| s
.chars()
.map(|x| x.to_digit(10).unwrap())
.collect::<Vec<u32>>())
.collect();
part_one(&input);
part_two(&input);
}
fn part_one(input: &Vec<Vec<u32>>) {
let mut count: u32 = (input.len()*2 + input[0].len()*2 - 4) as u32;
for row in 1..input.len()-1 {
for column in 1..input[0].len()-1 {
let cell = input[row][column];
let column_cells = input.iter().map(|x| x[column]);
// get list of cells in each direction
let cells_left = input[row].iter().take(column+1);
let cells_right = input[row].iter().skip(column);
let cells_up = column_cells.clone().take(row+1);
let cells_down = column_cells.clone().skip(row);
// check if theres a larger cell in any direction
if (*cells_left.clone().max().unwrap() == cell && cells_left.filter(|&&i| i == cell).count() == 1) ||
(*cells_right.clone().max().unwrap() == cell && cells_right.filter(|&&i| i == cell).count() == 1) ||
(cells_up.clone().max().unwrap() == cell && cells_up.filter(|&i| i == cell).count() == 1) ||
(cells_down.clone().max().unwrap() == cell && cells_down.filter(|&i| i == cell).count() == 1)
{
count += 1;
}
}
}
println!("Part one: {count}");
}
fn part_two(input: &Vec<Vec<u32>>) {
let mut highest_scenic_score: u32 = 0;
for row in 1..input.len()-1 {
for column in 1..input[0].len()-1 {
let cell = input[row][column];
// count viewable trees to the left
let mut viewable_left: u32 = 0;
for &tree in input[row].iter().take(column).rev() {
viewable_left += 1;
if tree >= cell {
break;
}
}
// count viewable trees to the right
let mut viewable_right: u32 = 0;
for &tree in input[row].iter().skip(column+1) {
viewable_right += 1;
if tree >= cell {
break;
}
}
// count viewable trees upwards
let mut viewable_up: u32 = 0;
for tree_row in input.iter().take(row).rev() {
viewable_up += 1;
if tree_row[column] >= cell {
break;
}
}
// count viewable trees downwards
let mut viewable_down: u32 = 0;
for tree_row in input.iter().skip(row+1) {
viewable_down += 1;
if tree_row[column] >= cell {
break;
}
}
// calculate scenic score and check if it's the new highest
let scenic_score = viewable_left * viewable_right * viewable_up * viewable_down;
if scenic_score > highest_scenic_score {
highest_scenic_score = scenic_score;
}
}
}
println!("Part two: {highest_scenic_score}");
}