From 5bcc40b0305a92879cadf58a1907f4f6333fd9ae Mon Sep 17 00:00:00 2001 From: Joseph Montanaro Date: Sun, 12 Dec 2021 21:55:21 -0800 Subject: [PATCH] day 9 part 1 (not working) --- 2021/src/day9.rs | 105 +++++++++++++++++++++++++++++++++++++++++++++++ 2021/src/main.rs | 6 +-- 2 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 2021/src/day9.rs diff --git a/2021/src/day9.rs b/2021/src/day9.rs new file mode 100644 index 0000000..90bcb96 --- /dev/null +++ b/2021/src/day9.rs @@ -0,0 +1,105 @@ +use color_eyre::eyre; +use eyre::eyre; + + +// #[derive(Eq, PartialEq)] +enum Elevation { + High, + Mid, + Low, +} +use Elevation::*; + + +fn load(data: &str) -> eyre::Result>> { + let mut heights = Vec::new(); + for line in data.lines() { + let mut row = Vec::new(); + for c in line.chars() { + match c.to_digit(10) { + Some(d) => row.push(d), + None => return Err(eyre!("Invalid character (not a digit): {}", c)), + } + } + heights.push(row); + } + Ok(heights) +} + + +fn cmp_horizontal(row: &[u32], pos: usize) -> Elevation { + let prev = if pos == 0 {None} else {Some(row[pos - 1])}; + let next = if pos == row.len() - 1 {None} else {Some(row[pos + 1])}; + let current = row[pos]; + + if current > prev.unwrap_or(0) && current > next.unwrap_or(0) { + High + } + else if current < prev.unwrap_or(9) && current < next.unwrap_or(9) { + Low + } + else { + Mid + } +} + + +fn scan(map: &[Vec]) -> Vec> { + let mut result: Vec> = Vec::new(); + for (r, row) in map.iter().enumerate() { + let mut scanned_row = Vec::new(); + for (col, height) in row.iter().enumerate() { + let elev = match cmp_horizontal(row, col) { + High => { + if r == 0 || height > &map[r - 1][col] { + High + } + else { + Mid + } + }, + Low => { + if r == 0 || height < &map[r - 1][col] { + Low + } + else { + Mid + } + }, + Mid => Mid, + }; + + if r > 0 { + let above = &result[r - 1][col]; + if let (&High, &High) | (&Low, &Low) = (&elev, above) { + result[r - 1][col] = Mid; + } + } + scanned_row.push(elev); + } + result.push(scanned_row); + } + result +} + + +fn part1(map: &[Vec], compares: &[Vec]) -> u32 { + let mut result = 0; + for (r, row) in compares.iter().enumerate() { + for (col, elev) in row.iter().enumerate() { + if let Low = elev { + result += map[r][col] + 1 + } + } + } + result +} + + +pub fn run(data: &str) -> eyre::Result<(u32, u32)> { + let map = load(data)?; + let compares = scan(&map); + + let one = part1(&map, &compares); + Ok((one, 0)) +} diff --git a/2021/src/main.rs b/2021/src/main.rs index 806623b..ece7b77 100644 --- a/2021/src/main.rs +++ b/2021/src/main.rs @@ -4,14 +4,14 @@ use color_eyre::eyre; mod lib; use lib::load; -mod day8; +mod day9; fn main() -> eyre::Result<()> { - let data = load("data/08.txt")?; + let data = load("data/09.txt")?; let start = Instant::now(); - let (one, two) = day8::run(&data)?; + let (one, two) = day9::run(&data)?; let (dur, unit) = format_ns(start.elapsed().as_nanos()); let precision = 2.0 - dur.log10().floor();