From fa26f694d8cf98272763952a698301ee9935c19e Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Thu, 26 Jun 2025 09:47:23 +0200 Subject: Added 2022, first few problems --- 2022/08/a.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 2022/08/b.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2022/08/common.rs | 13 +++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 2022/08/a.rs create mode 100644 2022/08/b.rs create mode 100644 2022/08/common.rs (limited to '2022/08') 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 @@ +use std::cmp::max; +mod common; +use common::*; + +fn mark_visible(grid: &mut Grid) { + let update = |elem: &mut (i8, bool), m: &mut i8| { + elem.1 = elem.1 || elem.0 > *m; + *m = max(*m, elem.0); + }; + + for row in &mut *grid { + // From left + let mut m = -1; + for t in &mut *row { update(t, &mut m); } + + // From right + let mut m = -1; + for t in &mut row.iter_mut().rev() { update(t, &mut m); } + } + + for j in 0..grid[0].len() { + // From top + let mut m = -1; + for i in 0..grid.len() { update(&mut grid[i][j], &mut m); } + + // From bottom + let mut m = -1; + for i in (0..grid.len()).rev() { update(&mut grid[i][j], &mut m); } + } +} + +fn count_visible(grid: &Grid) -> usize { + grid.iter() + .map(|row| row.iter().filter(|c| c.1).count()) + .sum() +} + +fn main() { + let mut grid = read_grid_from_stdin(); + mark_visible(&mut grid); + println!("{}", count_visible(&grid)); +} 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 @@ +use std::cmp::max; +mod common; +use common::*; + +fn count_visible_from(grid: &Grid, i0: usize, j0: usize) -> usize { + let x = grid[i0][j0].0; + let mut top = 0; + for i in (0..i0).rev() { + top += 1; + if grid[i][j0].0 >= x { break; } + } + + let mut bottom = 0; + for i in i0+1..grid.len() { + bottom += 1; + if grid[i][j0].0 >= x { break; } + } + + let mut left = 0; + for j in (0..j0).rev() { + left += 1; + if grid[i0][j].0 >= x { break; } + } + + let mut right = 0; + for j in j0+1..grid[0].len() { + right += 1; + if grid[i0][j].0 >= x { break; } + } + + top * bottom * left * right +} + +fn max_view_factor(grid: &Grid) -> usize { + let mut m = 0; + for i in 0..grid.len() { + for j in 0..grid[0].len() { + m = max(m, count_visible_from(grid, i, j)); + } + } + m +} + +fn main() { + let grid = read_grid_from_stdin(); + println!("{}", max_view_factor(&grid)); +} 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 @@ +pub type Grid = Vec>; + +pub fn read_grid_from_stdin() -> Grid { + let mut grid = Vec::>::new(); + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + let row = line[..line.len()-1].as_bytes().iter() + .map(|b| ((*b as i8) - ('0' as i8), false)).collect(); + grid.push(row); + line.clear(); + } + grid +} -- cgit v1.3