fn main() { let input = lib::read_input(8); part1(&input); part2(&input); } fn part1(input: &str) { let input = input.split_whitespace().map(|x| x.bytes().collect::>()).collect::>(); let mut ans = 0; for (y, line) in input.iter().enumerate() { for (x, _) in line.iter().enumerate() { if visible(&input, x, y) { ans += 1; } } } println!("{}", ans); } fn part2(input: &str) { let input = input.split_whitespace().map(|x| x.bytes().collect::>()).collect::>(); let mut ans = 0; for (y, line) in input.iter().enumerate() { for (x, _) in line.iter().enumerate() { ans = ans.max(scenic_score(&input, x, y)); } } println!("{}", ans); } fn scenic_score(heights: &[Vec], x: usize, y: usize) -> u32 { let mut score = 1; for (dy, dx) in &[(0, 1), (0, -1), (1, 0), (-1, 0)] { let height = heights[y][x]; let mut seen = 0; let mut sx = x as i32; let mut sy = y as i32; loop { sx += dx; sy += dy; if sx < 0 || sy < 0 || sy >= heights.len() as i32 || sx >= heights[sy as usize].len() as i32 { break; } seen += 1; if heights[sy as usize][sx as usize] >= height { break; } } score *= seen; } score } fn visible(heights: &[Vec], x: usize, y: usize) -> bool { for (dy, dx) in &[(0, 1), (0, -1), (1, 0), (-1, 0)] { let height = heights[y][x]; let mut sx = x as i32; let mut sy = y as i32; loop { sx += dx; sy += dy; if sx < 0 || sy < 0 || sx >= heights[0].len() as i32 || sy >= heights.len() as i32 { return true; } if heights[sy as usize][sx as usize] >= height { break; } } } return false; }