diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2025-06-26 09:47:23 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2025-06-26 23:37:23 +0200 |
| commit | fa26f694d8cf98272763952a698301ee9935c19e (patch) | |
| tree | 5af7a788fb8e9fa12b2b2fbea64250ed496a23c0 /2022/08 | |
| parent | f0159b7d36e2c81182f2d047a34bf883394894db (diff) | |
| download | aoc-fa26f694d8cf98272763952a698301ee9935c19e.tar.gz aoc-fa26f694d8cf98272763952a698301ee9935c19e.zip | |
Added 2022, first few problems
Diffstat (limited to '2022/08')
| -rw-r--r-- | 2022/08/a.rs | 42 | ||||
| -rw-r--r-- | 2022/08/b.rs | 47 | ||||
| -rw-r--r-- | 2022/08/common.rs | 13 |
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 @@ | |||
| 1 | use std::cmp::max; | ||
| 2 | mod common; | ||
| 3 | use common::*; | ||
| 4 | |||
| 5 | fn 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 | |||
| 32 | fn count_visible(grid: &Grid) -> usize { | ||
| 33 | grid.iter() | ||
| 34 | .map(|row| row.iter().filter(|c| c.1).count()) | ||
| 35 | .sum() | ||
| 36 | } | ||
| 37 | |||
| 38 | fn 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 @@ | |||
| 1 | use std::cmp::max; | ||
| 2 | mod common; | ||
| 3 | use common::*; | ||
| 4 | |||
| 5 | fn 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 | |||
| 34 | fn 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 | |||
| 44 | fn 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 @@ | |||
| 1 | pub type Grid = Vec<Vec<(i8, bool)>>; | ||
| 2 | |||
| 3 | pub 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 | } | ||
