Advertisement
nairby

2022 Day 08

Dec 8th, 2022 (edited)
1,595
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.59 KB | None | 0 0
  1. use std::env;
  2. use std::io::{self, prelude::*, BufReader};
  3. use std::fs::File;
  4.  
  5. const DIM: usize = 99; // Sample=5
  6.  
  7. fn visible_trees(tree_map: &Vec<Vec<u32>>) -> usize {
  8.     let mut num_visible = 0;
  9.     for y in 0..DIM {
  10.         'srch: for x in 0..DIM {
  11.            // Handle edges
  12.            if x == 0 || y == 0 || x == DIM-1 || y == DIM-1 { num_visible += 1; continue 'srch; }
  13.             let v = tree_map[x][y];
  14.             // Scan -y
  15.             let mut visible = true;
  16.             'ym: for y0 in 0..y {
  17.                if tree_map[x][y0] >= v { visible = false; break 'ym; }
  18.             }
  19.             if visible { num_visible += 1; continue 'srch; }
  20.            // Scan +y
  21.            let mut visible = true;
  22.            'yp: for y0 in y+1..DIM {
  23.                 if tree_map[x][y0] >= v { visible = false; break 'yp; }
  24.            }
  25.            if visible { num_visible += 1; continue 'srch; }
  26.             // Scan -x
  27.             let mut visible = true;
  28.             'xm: for x0 in 0..x {
  29.                if tree_map[x0][y] >= v { visible = false; break 'xm; }
  30.             }
  31.             if visible { num_visible += 1; continue 'srch; }
  32.            // Scan +x
  33.            let mut visible = true;
  34.            'xp: for x0 in x+1..DIM {
  35.                 if tree_map[x0][y] >= v { visible = false; break 'xp; }
  36.            }
  37.            if visible { num_visible += 1; continue 'srch; }
  38.         }
  39.     }
  40.     num_visible
  41. }
  42.  
  43. fn scenic_score(tree_map: &Vec<Vec<u32>>) -> usize {
  44.     let mut max_scenic = 0;
  45.     for y in 0..DIM {
  46.         'srch: for x in 0..DIM {
  47.            // Handle edges
  48.            if x == 0 || y == 0 || x == DIM-1 || y == DIM-1 { continue 'srch; } // Zero scenic
  49.             let v = tree_map[x][y];
  50.             // Scan -y
  51.             let mut dist_ym = 0;
  52.             'ym: for y0 in (0..y).rev() {
  53.                if tree_map[x][y0] <= v { dist_ym += 1; }
  54.                if tree_map[x][y0] >= v { break 'ym; }
  55.             }
  56.             // Scan +y
  57.             let mut dist_yp = 0;
  58.             'yp: for y0 in y+1..DIM {
  59.                if tree_map[x][y0] <= v { dist_yp += 1; }
  60.                if tree_map[x][y0] >= v { break 'yp; }
  61.             }
  62.             // Scan -x
  63.             let mut dist_xm = 0;
  64.             'xm: for x0 in (0..x).rev() {
  65.                if tree_map[x0][y] <= v { dist_xm += 1; }
  66.                if tree_map[x0][y] >= v { break 'xm; }
  67.             }
  68.             // Scan +x
  69.             let mut dist_xp = 0;
  70.             'xp: for x0 in x+1..DIM {
  71.                if tree_map[x0][y] <= v { dist_xp += 1; }
  72.                if tree_map[x0][y] >= v { break 'xp; }
  73.             }
  74.             max_scenic = std::cmp::max(max_scenic, dist_ym * dist_yp * dist_xp * dist_xm);
  75.         }
  76.     }
  77.     max_scenic
  78. }
  79.  
  80. fn solve(input: &str) -> io::Result<()> {
  81.     let file = File::open(input).expect("Input file not found.");
  82.     let reader = BufReader::new(file);
  83.  
  84.     // Input
  85.     let input: Vec<String> = match reader.lines().collect() {
  86.         Err(err) => panic!("Unknown error reading input: {}", err),
  87.         Ok(result) => result,
  88.     };
  89.  
  90.     // Build tree map
  91.     let mut tree_map = vec![vec![0; DIM]; DIM];
  92.     for (y,line) in input.iter().enumerate() {
  93.         for (x,c) in line.chars().enumerate() {
  94.             tree_map[x][y] = c.to_digit(10).unwrap();
  95.         }
  96.     }
  97.  
  98.     // Outputs
  99.     println!("Part 1: {}",visible_trees(&tree_map)); // 1693
  100.     println!("Part 2: {}",scenic_score(&tree_map)); // 422059
  101.  
  102.     Ok(())
  103. }
  104.  
  105. fn main() {
  106.     let args: Vec<String> = env::args().collect();
  107.     let filename = &args[1];
  108.     solve(&filename).unwrap();
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement