aboutsummaryrefslogtreecommitdiff
path: root/2022/08/a.rs
blob: b145486dc95825807c3c98a20352247564e95819 (plain)
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
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));
}

Generated with cgit - Back to sebastiano.tronto.net