diff options
author | Santo Cariotti <santo@dcariotti.me> | 2022-12-05 19:46:06 +0100 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2022-12-05 19:46:06 +0100 |
commit | cf6303a5bc1558ebdb7b467da38f74cd3ac3a9b1 (patch) | |
tree | 6292cb239a8cf114179c6e7c8b3015840dfbae6e /2021/day9/src | |
parent | 6e10cc2773fcaff64902b13f44443da014f38be7 (diff) |
Add 2022
Diffstat (limited to '2021/day9/src')
-rw-r--r-- | 2021/day9/src/lib.rs | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/2021/day9/src/lib.rs b/2021/day9/src/lib.rs new file mode 100644 index 0000000..3391a74 --- /dev/null +++ b/2021/day9/src/lib.rs @@ -0,0 +1,90 @@ +use std::str::FromStr; + +#[derive(Debug)] +struct Heightmap { + data: Vec<Vec<u8>>, + rows: usize, + cols: usize, +} + +impl FromStr for Heightmap { + type Err = (); + + fn from_str(s: &str) -> Result<Self, Self::Err> { + let rows: Vec<_> = s.trim().split('\n').collect::<Vec<&str>>(); + let mut data: Vec<Vec<u8>> = vec![]; + for row in &rows { + data.push( + row.chars() + .map(|x| x.to_digit(10).unwrap() as u8) + .collect::<Vec<u8>>(), + ); + } + Ok(Heightmap { + data, + rows: rows.len(), + cols: rows[0].chars().count(), + }) + } +} + +impl Heightmap { + fn resolve(&self) -> usize { + let mut count: usize = 0; + + for i in 0..self.rows { + for j in 0..self.cols { + let top = if i > 0 { self.data[i - 1][j] } else { 10 }; + + let bottom = if i < self.rows - 1 { + self.data[i + 1][j] + } else { + 10 + }; + + let left = if j > 0 { self.data[i][j - 1] } else { 10 }; + + let right = if j < self.cols - 1 { + self.data[i][j + 1] + } else { + 10 + }; + let center = self.data[i][j]; + + if center < top && center < bottom && center < left && center < right { + count += (center + 1) as usize; + } + } + } + + count + } +} + +pub fn part1(input: &str) -> usize { + let grid: Heightmap = input.parse().unwrap(); + let result = grid.resolve(); + + result +} + +#[cfg(test)] +mod day9_test { + use super::*; + + #[test] + fn test_with_example_data() { + let data = include_str!("../example.txt"); + let result = part1(data); + + assert_eq!(result, 15); + } + + #[test] + fn test_puzzle_input_part1() { + let data = include_str!("../input.txt"); + let result = part1(data); + + assert_eq!(result, 541); + } +} |