1
0

Added day 12 solutions

This commit is contained in:
Ishan Jain 2022-12-12 13:53:08 +05:30
parent 8ac6d089e4
commit a8022a41bf
Signed by: ishan
GPG Key ID: 0506DB2A1CC75C27
4 changed files with 261 additions and 0 deletions

View File

@ -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<const M: usize, const N: usize> {
grid: [[u8; N]; M],
start: (usize, usize),
end: (usize, usize),
}
fn parse<const M: usize, const N: usize>(input: &[u8]) -> Grid<M, N> {
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<const M: usize, const N: usize>(input: Grid<M, N>) -> 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);
})
}

View File

@ -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<const M: usize, const N: usize> {
grid: [[u8; N]; M],
end: (usize, usize),
}
fn parse<const M: usize, const N: usize>(input: &[u8]) -> Grid<M, N> {
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<const M: usize, const N: usize>(input: Grid<M, N>) -> usize {
// Find a path from b'E' to the closest b'a'
bfs::<M, N>(&input.grid, (input.end.0, input.end.1, 0))
}
fn bfs<const M: usize, const N: usize>(
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);
})
}

41
src/day12/input.txt Normal file
View File

@ -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

5
src/day12/sample.txt Normal file
View File

@ -0,0 +1,5 @@
Sabqponm
abcryxxl
accszExk
acctuvwj
abdefghi