From a8022a41bfb302fafc6f1f7b78e29959f97b8412 Mon Sep 17 00:00:00 2001 From: Ishan Jain Date: Mon, 12 Dec 2022 13:53:08 +0530 Subject: [PATCH] Added day 12 solutions --- src/day12/1.rs | 108 +++++++++++++++++++++++++++++++++++++++++++ src/day12/2.rs | 107 ++++++++++++++++++++++++++++++++++++++++++ src/day12/input.txt | 41 ++++++++++++++++ src/day12/sample.txt | 5 ++ 4 files changed, 261 insertions(+) create mode 100644 src/day12/input.txt create mode 100644 src/day12/sample.txt diff --git a/src/day12/1.rs b/src/day12/1.rs index e69de29..4c84e77 100644 --- a/src/day12/1.rs +++ b/src/day12/1.rs @@ -0,0 +1,108 @@ +#![feature(test)] + +use std::collections::VecDeque; +extern crate test; + +const INPUTS: [&[u8]; 2] = [ + include_bytes!("./sample.txt"), + include_bytes!("./input.txt"), +]; + +struct Grid { + grid: [[u8; N]; M], + start: (usize, usize), + end: (usize, usize), +} + +fn parse(input: &[u8]) -> Grid { + let mut out = [[0; N]; M]; + let mut start = (0, 0); + let mut end = (0, 0); + + for (i, row) in input.split(|&c| c == b'\n').enumerate() { + for (j, v) in row.iter().enumerate() { + out[i][j] = match *v { + b'E' => { + end = (i, j); + b'z' + } + b'S' => { + start = (i, j); + b'a' + } + v => v, + }; + } + } + + Grid { + grid: out, + start, + end, + } +} + +fn main() { + let output = parse::<5, 8>(INPUTS[0]); + let score = solution::<5, 8>(output); + println!("{}", score); + let output = parse::<41, 61>(INPUTS[1]); + let score = solution::<41, 61>(output); + println!("{}", score); +} + +fn solution(input: Grid) -> usize { + let mut q = VecDeque::with_capacity(500); + q.push_back((input.start.0, input.start.1, 0)); + + let mut visited = [[false; N]; M]; + + while !q.is_empty() { + let l = q.len(); + + for _ in 0..l { + let next = q.pop_front().unwrap(); + let cheight = input.grid[next.0][next.1]; + + if next.0 == input.end.0 && next.1 == input.end.1 { + return next.2; + } + + if visited[next.0][next.1] { + continue; + } + visited[next.0][next.1] = true; + + for (x, y) in [(-1, 0), (1, 0), (0, -1), (0, 1)] { + let i = next.0 as i32 + x; + let j = next.1 as i32 + y; + + if i < 0 + || j < 0 + || i >= M as i32 + || j >= N as i32 + || visited[i as usize][j as usize] + { + continue; + } + + let nheight = input.grid[i as usize][j as usize]; + + if nheight - cheight <= 1 || nheight <= cheight { + q.push_back((i as usize, j as usize, next.2 + 1)) + } + } + } + } + + 0 +} + +#[bench] +fn solution_bench(b: &mut test::Bencher) { + b.iter(|| { + let input = parse::<41, 61>(INPUTS[1]); + let result = solution(input); + test::black_box(result); + }) +} diff --git a/src/day12/2.rs b/src/day12/2.rs index e69de29..6dff54e 100644 --- a/src/day12/2.rs +++ b/src/day12/2.rs @@ -0,0 +1,107 @@ +#![feature(test)] + +use std::collections::VecDeque; +extern crate test; + +const INPUTS: [&[u8]; 2] = [ + include_bytes!("./sample.txt"), + include_bytes!("./input.txt"), +]; + +struct Grid { + grid: [[u8; N]; M], + end: (usize, usize), +} + +fn parse(input: &[u8]) -> Grid { + let mut out = [[0; N]; M]; + let mut end = (0, 0); + + for (i, row) in input.split(|&c| c == b'\n').enumerate() { + for (j, v) in row.iter().enumerate() { + out[i][j] = match *v { + b'E' => { + end = (i, j); + b'z' + } + b'S' => b'a', + v => v, + }; + } + } + + Grid { grid: out, end } +} + +fn main() { + let output = parse::<5, 8>(INPUTS[0]); + let score = solution::<5, 8>(output); + println!("{}", score); + let output = parse::<41, 61>(INPUTS[1]); + let score = solution::<41, 61>(output); + println!("{}", score); +} + +fn solution(input: Grid) -> usize { + // Find a path from b'E' to the closest b'a' + bfs::(&input.grid, (input.end.0, input.end.1, 0)) +} + +fn bfs( + input: &[[u8; N]; M], + start: (usize, usize, usize), +) -> usize { + let mut q = VecDeque::with_capacity(500); + q.push_back(start); + + let mut visited = [[false; N]; M]; + + while !q.is_empty() { + let l = q.len(); + + for _ in 0..l { + let next = q.pop_front().unwrap(); + let cheight = input[next.0][next.1]; + + if cheight == b'a' { + return next.2; + } + + if visited[next.0][next.1] { + continue; + } + visited[next.0][next.1] = true; + + for (x, y) in [(-1, 0), (1, 0), (0, -1), (0, 1)] { + let i = next.0 as i32 + x; + let j = next.1 as i32 + y; + + if i < 0 + || j < 0 + || i >= M as i32 + || j >= N as i32 + || visited[i as usize][j as usize] + { + continue; + } + + let nheight = input[i as usize][j as usize]; + + if cheight - nheight <= 1 || cheight <= nheight { + q.push_back((i as usize, j as usize, next.2 + 1)) + } + } + } + } + + std::usize::MAX +} + +#[bench] +fn solution_bench(b: &mut test::Bencher) { + b.iter(|| { + let input = parse::<41, 61>(INPUTS[1]); + let result = solution(input); + test::black_box(result); + }) +} diff --git a/src/day12/input.txt b/src/day12/input.txt new file mode 100644 index 0000000..50f04d9 --- /dev/null +++ b/src/day12/input.txt @@ -0,0 +1,41 @@ +abccccaaaaaaacccaaaaaaaccccccccccccccccccccccccccccccccccaaaa +abcccccaaaaaacccaaaaaaaaaaccccccccccccccccccccccccccccccaaaaa +abccaaaaaaaaccaaaaaaaaaaaaaccccccccccccccccccccccccccccaaaaaa +abccaaaaaaaaaaaaaaaaaaaaaaacccccccccaaaccccacccccccccccaaacaa +abaccaaaaaaaaaaaaaaaaaacacacccccccccaaacccaaaccccccccccccccaa +abaccccaaaaaaaaaaaaaaaacccccccccccccaaaaaaaaaccccccccccccccaa +abaccccaacccccccccaaaaaacccccccccccccaaaaaaaacccccccccccccccc +abcccccaaaacccccccaaaaaaccccccccijjjjjjaaaaaccccccaaccaaccccc +abccccccaaaaacccccaaaacccccccciiijjjjjjjjjkkkkkkccaaaaaaccccc +abcccccaaaaacccccccccccccccccciiiirrrjjjjjkkkkkkkkaaaaaaccccc +abcccccaaaaaccccccccccccccccciiiirrrrrrjjjkkkkkkkkkaaaaaccccc +abaaccacaaaaacccccccccccccccciiiqrrrrrrrrrrssssskkkkaaaaacccc +abaaaaacaaccccccccccccccccccciiiqqrtuurrrrrsssssskklaaaaacccc +abaaaaacccccccccccaaccccccccciiqqqttuuuurrssusssslllaaccccccc +abaaaaaccccccccaaaaccccccccciiiqqqttuuuuuuuuuuusslllaaccccccc +abaaaaaacccccccaaaaaaccccccciiiqqqttxxxuuuuuuuusslllccccccccc +abaaaaaaccccaaccaaaaacccccchhiiqqtttxxxxuyyyyvvsslllccccccccc +abaaacacccccaacaaaaaccccccchhhqqqqttxxxxxyyyyvvsslllccccccccc +abaaacccccccaaaaaaaacccccchhhqqqqtttxxxxxyyyvvssqlllccccccccc +abacccccaaaaaaaaaaccaaacchhhpqqqtttxxxxxyyyyvvqqqlllccccccccc +SbaaacaaaaaaaaaaaacaaaaahhhhppttttxxEzzzzyyvvvqqqqlllcccccccc +abaaaaaaacaaaaaacccaaaaahhhppptttxxxxxyyyyyyyvvqqqlllcccccccc +abaaaaaaccaaaaaaaccaaaaahhhppptttxxxxywyyyyyyvvvqqqmmcccccccc +abaaaaaaacaaaaaaacccaaaahhhpppsssxxwwwyyyyyyvvvvqqqmmmccccccc +abaaaaaaaaaaaaaaacccaacahhhpppssssssswyyywwvvvvvqqqmmmccccccc +abaaaaaaaacacaaaacccccccgggppppsssssswwywwwwvvvqqqqmmmccccccc +abcaaacaaaccccaaaccccccccgggppppppssswwwwwrrrrrqqqmmmmccccccc +abcaaacccccccccccccccccccgggggpppoosswwwwwrrrrrqqmmmmddcccccc +abccaacccccccccccccccccccccgggggoooosswwwrrrnnnmmmmmddddccccc +abccccccccccccccccccccccccccgggggooossrrrrrnnnnnmmmddddaccccc +abaccccaacccccccccccccccccccccgggfoossrrrrnnnnndddddddaaacccc +abaccaaaaaaccccccccccccccccccccgffooorrrrnnnneeddddddaaaacccc +abaccaaaaaacccccccccccccccccccccfffooooonnnneeeddddaaaacccccc +abacccaaaaaccccccccaaccaaaccccccffffoooonnneeeeccaaaaaacccccc +abcccaaaaacccccccccaaccaaaaccccccffffoooneeeeeaccccccaacccccc +abaccaaaaaccccccccaaaacaaaaccccccafffffeeeeeaaacccccccccccccc +abacccccccccccccccaaaacaaacccccccccffffeeeecccccccccccccccaac +abaaaacccccccaaaaaaaaaaaaaacccccccccfffeeeccccccccccccccccaaa +abaaaacccccccaaaaaaaaaaaaaaccccccccccccaacccccccccccccccccaaa +abaacccccccccaaaaaaaaaaaaaaccccccccccccaacccccccccccccccaaaaa +abaaaccccccccccaaaaaaaaccccccccccccccccccccccccccccccccaaaaaa diff --git a/src/day12/sample.txt b/src/day12/sample.txt new file mode 100644 index 0000000..86e9cac --- /dev/null +++ b/src/day12/sample.txt @@ -0,0 +1,5 @@ +Sabqponm +abcryxxl +accszExk +acctuvwj +abdefghi