Added day 12 solutions
This commit is contained in:
parent
8ac6d089e4
commit
a8022a41bf
108
src/day12/1.rs
108
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<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);
|
||||
})
|
||||
}
|
107
src/day12/2.rs
107
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<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
41
src/day12/input.txt
Normal 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
5
src/day12/sample.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
Sabqponm
|
||||
abcryxxl
|
||||
accszExk
|
||||
acctuvwj
|
||||
abdefghi
|
Loading…
Reference in New Issue
Block a user