From e4fd84292babd45b6210100e6856853a6f5ad072 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 12 Dec 2022 18:46:51 -0500 Subject: [PATCH] do day 12 --- 2022/input/day_12.txt | 41 +++++++++++++ 2022/input/day_12_sample.txt | 5 ++ 2022/src/day_12.rs | 113 +++++++++++++++++++++++++++++++++++ 2022/src/lib.rs | 1 + 4 files changed, 160 insertions(+) create mode 100644 2022/input/day_12.txt create mode 100644 2022/input/day_12_sample.txt create mode 100644 2022/src/day_12.rs diff --git a/2022/input/day_12.txt b/2022/input/day_12.txt new file mode 100644 index 0000000..d469653 --- /dev/null +++ b/2022/input/day_12.txt @@ -0,0 +1,41 @@ +abcccaaaaaaccccccccaaaaaccccccaaaaaaccccccaaaaaaaacccaaaaaaaccaaaacccccccccccccccccccccccccaaaaaacccccccccccccccccccccccccccccaaaaaa +abcccaaaaaacccccccaaaaaaccccaaaaaaaacccccccaaaaaaaaaaaaaaaaccaaaaacccccccccccccccccccccccccaaaaaacccccccccccccccccccccccccccccaaaaaa +abccccaaaaacaaaccaaaaaaaacccaaaaaaaaacccccccaaaaaaaaaaaaaaaacaaaaaacccccccccaaacccccccccccaaaaaaaaccccccccccaaccccccccccccccccaaaaaa +abccccaaaaccaaaaaaaaaaaaacccaaaaaaaaaacccccaaaaaaaaaaaaaaaaaaacaaaacccccccccaaaacccccccccaaaaaaaaaacccccccccaaaccccccccccccccccccaaa +abcccccccccaaaaaacccaacccccccccaaacaaaccccccaacccccccaaaaaaaaacaacccccccccccaaaacccccccccaaaaaaaaaacccccccccaaaccacaaccccccccccccaaa +abcccccccccaaaaaacccaacccccccccaaacccccccccccccccccccaaaacaaaacccccccaacaaccaaaccccccccccaccaaaaacacccccccccaaaacaaaaccccccccccccaac +abccccccccccaaaaacccccccccccccccacccaaaacccccccccccccaaaacccccccccccccaaaacccccccccccaacccccaaaaccccccccjjjjaaaaaaaaaccccccccccccccc +abccccccccccaaaacccccccccccccccccccaaaaacccccccccccccaaaccccccccccccccaaaaacccccccccaaaaaacccaaccccccccjjjjjjkkaaaacccccccccaacccccc +abcccccaaccccccccccccccccccccccccccaaaaaacccccccccccccaacccccccccccccaaaaaaccccccccccaaaaaccccccccccccjjjjjjjkkkkaacccccaacaaacccccc +abccaaaacccccccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccaaaacaccccccccaaaaaaaccccaacccccjjjjoooookkkkkkkklllaaaaaaacccc +abccaaaaaacccccccccccccccccccccccccaaaaacccccccccccccccccccccccccccccccaaccccccccccaaaaaaaaccaaaaccccjjjoooooookkkkkkkllllaaaaaacccc +abcccaaaaacccccccccccccccccccccccccccaaaccccccccaaaacccccccccccccccccccccccccccccccaaaaaaaaccaaaaccccjjooooooooppkkppplllllaccaacccc +abccaaaaaccccccccccccaccccccccccccccccccccccccccaaaacccccccccccccccccccccccccccccccccaaacacccaaaacccijjooouuuuoppppppppplllccccccccc +abcccccaacccccccccccaaaaaaaaccccccccccccccccccccaaaaccccaaccccccccaaacccccccccccccaacaaccccccccccccciijoouuuuuuppppppppplllcccaccccc +abcccccccccccccccccccaaaaaaccccccccccccccccccccccaaccccaaaacccccccaaaaccccccccccaaaaaaccccccccccccciiiiootuuuuuupuuuvvpppllccccccccc +abcccccccccccccccccccaaaaaaccaaaaacccccccccccccccccccccaaaacccccccaaaaccccccccccaaaaaaccccccccccccciiinnotuuxxxuuuuvvvpppllccccccccc +abccccccccccccccacccaaaaaaaacaaaaaaacccccccccccccccccccaaaacccccccaaacccccaaaaccaaaaaccccaaccccccciiiinnnttxxxxuuyyyvvqqqllccccccccc +abcccccccccccaaaaccaaaaaaaaaaaaaaaaaaccaacccccccccccccccccccccccccccccccccaaaacccaaaaaccaaacccccciiinnnnnttxxxxxyyyyvvqqqllccccccccc +abaaaacccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccccccaaaacccaaaaaacaaaccccciiinnnnttttxxxxxyyyyvvqqmmmccccccccc +abaaaaccccccccaaaaacccaaaaacaaaaaacaaaaaaccccccccccccccccaaccccccccccccccccaacccccccaaaaaaaaaaciiinnnnttttxxxxxyyyyvvqqqmmmccccccccc +SbaaaacccccccaaaaaccccaaaaaccaaaaaaaaaaaccccccccccccccccaaacaacccccccccccccccccccccccaaaaaaaaachhhnnntttxxxEzzzzyyvvvqqqmmmccccccccc +abaaaacccccccaacaacccccaaaaaaaacaaaaaaaaaccccccccccccccccaaaaaccccccccccccccccccccccccaaaaaaacchhhnnntttxxxxxyyyyyyvvvqqmmmdddcccccc +abaaaacccccccccccccccccccaaaaaacaaaaaaaaaacccccccccccccaaaaaaccccccccaaaccccccccccccccaaaaaaccchhhnnntttxxxxywyyyyyyvvvqqmmmdddccccc +abaacccccccccccccccccccaaaaaaacccccaaaaaaacccccccccccccaaaaaaaacccccaaaacccccccccccccaaaaaaacaahhhmmmttttxxwwyyyyyyyvvvqqmmmdddccccc +abcccccccccccccccccccccaaaaaaacaaccaaacccccccccccccccccaacaaaaacccccaaaacccccccccccccaaacaaaaaahhhmmmmtsssswwyywwwwvvvvqqqmmdddccccc +abcccccccccccccccaaaccccaaaaaaaaaacaaccaaccccccccccccccccaaacaccccccaaaacccccccccccccccccaaaaacahhhmmmmmsssswwywwwwwvvrrqqmmdddccccc +abcccccccccccccaaaaaaccccaaaaaaaaaccaaaacccccccccccccccccaacccccccccccccccccccccccaaaccccaaaaaaahhhhhmmmmssswwwwwrrrrrrrrmmmmddccccc +abcccccccccccccaaaaaaccccaaaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccaaaaaacccccaaaaachhhhhmmmmsswwwwrrrrrrrrrkkmdddccccc +abccccccccccccccaaaaaccccccaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccaaaaaaccccaaaaacccchhggmmmssswwrrrrrkkkkkkkkdddacccc +abccaaaacccccccaaaaacccccccccaaaaaacaaaaacccccccccccccccccccccccccccccccccccccccaaaaaaccccaacaaaccccggggmmsssssrrlkkkkkkkkkdddaccccc +abccaaaacccccccaaaaacccccccccaaaaaaccccaacccccccccccccccccccccccccccccccccccccccaaaaaccccccccaaccccccgggmllssssrllkkkkkkkeeeddaccccc +abccaaaacccccccaaacccccccccccaaaaaacccccccccccccccccccaacccccccccccccccccccccccaaaaaacccccccccccccccccggllllssslllkkeeeeeeeeeaaacccc +abcccaaccccccccaaacaaaccccccaaaaaaaaaaacccccccccccccaaaaaacccccccccccccccccccccaaacaaacccccaacccccccccggglllllllllfeeeeeeeeaaaaacccc +abccccccccccaaaaaaaaaaccccccccccccaccaaaccacccccccccaaaaaaccccaaccaacccaaccccccaaaaaaacccccaaccccccccccggglllllllfffeeecccaaaaaacccc +abccccccccccaaaaaaaaacccccccccccccccaaaaaaaccccccccccaaaaaccccaaaaaacccaaaaaaccaaaaaacccaaaaaaaacccccccggggllllfffffccccccaacccccccc +abcccccccccccaaaaaaacccccccccccccccccaaaaaaccaacccccaaaaaccccccaaaaacccaaaaaacaaaaaaacccaaaaaaaaccccccccgggffffffffccccccccccccccccc +abccccccccccccaaaaaaacccccccccccccaaaaaaaaacaaaaccccaaaaacaaaaaaaaaacaaaaaaacaaaaaaaaaccccaaaacccccccccccggffffffacccccccccccccccaaa +abccccccccccccaaaaaaacaaccccccccccaaaaaaaaacaaaacccccaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaacccaaaaacccccccccccaffffaaaaccccccccccccccaaa +abccccccccccccaaacaaaaaacccccccccccaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaacccaaacaaaccaaaaaacccccccccccccccccaaaccccccccccccccaaa +abccccccccccccaaccaaaaaccccccccccccccaaaaaaaccccaaaaaaaaaaaaccccaacccccaaaaaacccaaaccccccaaccaacccccccccccccccccaaacccccccccccaaaaaa +abcccccccccccccccaaaaaaaaccccccccccccaacccacccccccaaaaaaaaaaccccaacccccaaccccccccaccccccccccccccccccccccccccccccccccccccccccccaaaaaa diff --git a/2022/input/day_12_sample.txt b/2022/input/day_12_sample.txt new file mode 100644 index 0000000..86e9cac --- /dev/null +++ b/2022/input/day_12_sample.txt @@ -0,0 +1,5 @@ +Sabqponm +abcryxxl +accszExk +acctuvwj +abdefghi diff --git a/2022/src/day_12.rs b/2022/src/day_12.rs new file mode 100644 index 0000000..2e61984 --- /dev/null +++ b/2022/src/day_12.rs @@ -0,0 +1,113 @@ +use std::collections::{BinaryHeap, HashSet}; + +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +struct Location { + coords: (usize, usize), + steps: i32, +} +impl std::cmp::Ord for Location { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + other.steps.cmp(&self.steps) + } +} +impl PartialOrd for Location { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +type Data = Vec>; +type Output = u64; +fn parse(input: &str) -> Data { + input.lines().map(|l| l.chars().collect()).collect() +} + +fn distance(start: (usize, usize), end: (usize, usize)) -> usize { + start.0.abs_diff(end.0) + start.1.abs_diff(end.1) +} + +fn find_shortest_path(data: &Data, start: (usize, usize)) -> Output { + let bounds = (data.len() as i32, data[0].len() as i32); + + let mut visited: HashSet<(usize, usize)> = Default::default(); + let mut queue: BinaryHeap = BinaryHeap::from([Location { + coords: start, + steps: 0, + }]); + + 'outer: while let Some(loc) = queue.pop() { + if visited.contains(&loc.coords) { + continue 'outer; + } + visited.insert(loc.coords); + let (x, y) = loc.coords; + let (x, y) = (x as i32, y as i32); + let c = data[x as usize][y as usize]; + println!("{:?} {}", &loc, c); + if c == 'E' { + return loc.steps as Output; + } + 'inner: for (x2, y2) in [(x - 1, y), (x + 1, y), (x, y + 1), (x, y - 1)].iter() { + let coords = (*x2 as usize, *y2 as usize); + if !(0..bounds.0).contains(x2) + || !(0..bounds.1).contains(y2) + || visited.contains(&coords) + { + continue 'inner; + } + let c2 = data[*x2 as usize][*y2 as usize]; + if c == 'S' && c2 == 'a' + || c == 'z' && c2 == 'E' + || (c >= c2 && c2 != 'E') + || c as i32 + 1 == c2 as i32 + { + let steps = loc.steps + 1; + queue.push(Location { coords, steps }); + } + } + } + + Output::max_value() +} + +fn part_one(data: Data) -> Output { + let start = { + let mut start = None; + for (i, row) in data.iter().enumerate() { + for (j, c) in row.iter().enumerate() { + if c == &'S' { + start = Some((i, j)); + } + } + } + start.unwrap() + }; + find_shortest_path(&data, start) +} +fn part_two(data: Data) -> Output { + let starting_points = { + let mut starting_points = vec![]; + for (i, row) in data.iter().enumerate() { + for (j, c) in row.iter().enumerate() { + if c == &'S' || c == &'a' { + starting_points.push((i, j)); + } + } + } + starting_points + }; + starting_points + .iter() + .map(|start| find_shortest_path(&data, *start)) + .min() + .unwrap() +} + +advent_of_code_macro::generate_tests!( + day 12, + parse, + part_one, + part_two, + sample tests [31, 29], + star tests [449, 443] +); diff --git a/2022/src/lib.rs b/2022/src/lib.rs index 62054ab..998b588 100644 --- a/2022/src/lib.rs +++ b/2022/src/lib.rs @@ -10,3 +10,4 @@ mod day_08; mod day_09; mod day_10; mod day_11; +mod day_12;