aoc

My solutions for the Advent of Code
git clone https://git.tronto.net/aoc
Download | Log | Files | Refs | README

a.rs (993B)


      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 }