From 3984bbb5340aa8b0e9e1dae4278062488c93fdb5 Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Thu, 18 Apr 2024 23:53:09 +0200 Subject: [PATCH] =?UTF-8?q?rs:=20add=20=C2=AB463.=20Island=20Perimeter?= =?UTF-8?q?=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- rs/island-perimeter.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 rs/island-perimeter.rs diff --git a/rs/island-perimeter.rs b/rs/island-perimeter.rs new file mode 100644 index 0000000..bf97c84 --- /dev/null +++ b/rs/island-perimeter.rs @@ -0,0 +1,25 @@ +struct Solution {} +impl Solution { + fn indices(grid: &[Vec]) -> impl Iterator + '_ { + (0..grid.len()).flat_map(move |y| (0..grid[y].len()).map(move |x| (x as isize, y as isize))) + } + + fn in_range(grid: &[Vec], y: isize, x: isize) -> bool { + y >= 0 && y < grid.len() as isize && x >= 0 && x < grid[y as usize].len() as isize + } + + fn count_empty(grid: &[Vec], y: isize, x: isize) -> i32 { + [-1, 1] + .into_iter() + .flat_map(|d| [(x + d, y), (x, y + d)]) + .filter(|&(x, y)| !Self::in_range(grid, y, x) || grid[y as usize][x as usize] == 0) + .count() as i32 + } + + pub fn island_perimeter(grid: Vec>) -> i32 { + Self::indices(&grid) + .filter(|&(x, y)| grid[y as usize][x as usize] != 0) + .map(|(x, y)| Self::count_empty(&grid, y, x)) + .sum() + } +}