aboutsummaryrefslogtreecommitdiff
path: root/2022/08
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-06-26 09:47:23 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-06-26 23:37:23 +0200
commitfa26f694d8cf98272763952a698301ee9935c19e (patch)
tree5af7a788fb8e9fa12b2b2fbea64250ed496a23c0 /2022/08
parentf0159b7d36e2c81182f2d047a34bf883394894db (diff)
downloadaoc-fa26f694d8cf98272763952a698301ee9935c19e.tar.gz
aoc-fa26f694d8cf98272763952a698301ee9935c19e.zip
Added 2022, first few problems
Diffstat (limited to '2022/08')
-rw-r--r--2022/08/a.rs42
-rw-r--r--2022/08/b.rs47
-rw-r--r--2022/08/common.rs13
3 files changed, 102 insertions, 0 deletions
diff --git a/2022/08/a.rs b/2022/08/a.rs
new file mode 100644
index 0000000..b145486
--- /dev/null
+++ b/2022/08/a.rs
@@ -0,0 +1,42 @@
1use std::cmp::max;
2mod common;
3use common::*;
4
5fn mark_visible(grid: &mut Grid) {
6 let update = |elem: &mut (i8, bool), m: &mut i8| {
7 elem.1 = elem.1 || elem.0 > *m;
8 *m = max(*m, elem.0);
9 };
10
11 for row in &mut *grid {
12 // From left
13 let mut m = -1;
14 for t in &mut *row { update(t, &mut m); }
15
16 // From right
17 let mut m = -1;
18 for t in &mut row.iter_mut().rev() { update(t, &mut m); }
19 }
20
21 for j in 0..grid[0].len() {
22 // From top
23 let mut m = -1;
24 for i in 0..grid.len() { update(&mut grid[i][j], &mut m); }
25
26 // From bottom
27 let mut m = -1;
28 for i in (0..grid.len()).rev() { update(&mut grid[i][j], &mut m); }
29 }
30}
31
32fn count_visible(grid: &Grid) -> usize {
33 grid.iter()
34 .map(|row| row.iter().filter(|c| c.1).count())
35 .sum()
36}
37
38fn main() {
39 let mut grid = read_grid_from_stdin();
40 mark_visible(&mut grid);
41 println!("{}", count_visible(&grid));
42}
diff --git a/2022/08/b.rs b/2022/08/b.rs
new file mode 100644
index 0000000..5f7bce8
--- /dev/null
+++ b/2022/08/b.rs
@@ -0,0 +1,47 @@
1use std::cmp::max;
2mod common;
3use common::*;
4
5fn count_visible_from(grid: &Grid, i0: usize, j0: usize) -> usize {
6 let x = grid[i0][j0].0;
7 let mut top = 0;
8 for i in (0..i0).rev() {
9 top += 1;
10 if grid[i][j0].0 >= x { break; }
11 }
12
13 let mut bottom = 0;
14 for i in i0+1..grid.len() {
15 bottom += 1;
16 if grid[i][j0].0 >= x { break; }
17 }
18
19 let mut left = 0;
20 for j in (0..j0).rev() {
21 left += 1;
22 if grid[i0][j].0 >= x { break; }
23 }
24
25 let mut right = 0;
26 for j in j0+1..grid[0].len() {
27 right += 1;
28 if grid[i0][j].0 >= x { break; }
29 }
30
31 top * bottom * left * right
32}
33
34fn max_view_factor(grid: &Grid) -> usize {
35 let mut m = 0;
36 for i in 0..grid.len() {
37 for j in 0..grid[0].len() {
38 m = max(m, count_visible_from(grid, i, j));
39 }
40 }
41 m
42}
43
44fn main() {
45 let grid = read_grid_from_stdin();
46 println!("{}", max_view_factor(&grid));
47}
diff --git a/2022/08/common.rs b/2022/08/common.rs
new file mode 100644
index 0000000..45fbf10
--- /dev/null
+++ b/2022/08/common.rs
@@ -0,0 +1,13 @@
1pub type Grid = Vec<Vec<(i8, bool)>>;
2
3pub fn read_grid_from_stdin() -> Grid {
4 let mut grid = Vec::<Vec<(i8, bool)>>::new();
5 let mut line = String::new();
6 while std::io::stdin().read_line(&mut line).unwrap() > 0 {
7 let row = line[..line.len()-1].as_bytes().iter()
8 .map(|b| ((*b as i8) - ('0' as i8), false)).collect();
9 grid.push(row);
10 line.clear();
11 }
12 grid
13}

Generated with cgit - Back to sebastiano.tronto.net