2023 - Day 21 [Part 1]
This commit is contained in:
parent
7320181194
commit
6195d1579a
131
2023/input/21/input
Normal file
131
2023/input/21/input
Normal file
|
@ -0,0 +1,131 @@
|
|||
...................................................................................................................................
|
||||
.#....#......#.#......#...#...##.....#.#.#....#.##....#...#.............#.#......##..#.......#.............#......#...#..#...##....
|
||||
..#...#.#.#....####.....##.........................##.#..#...............##.......#....#.....#........#...#.....#.......#..........
|
||||
.#.......#......#.#.#....#..............###...#................................................#....#.#..............#.............
|
||||
................#....#....#..........#........#....................................##....##........#.....#.#....................#..
|
||||
.................#..........#...........##...#......#.#.#..................#......#.........##....#...#.....#.#........#..#........
|
||||
..##...#..........#...#..##..#.............#................................##......#.....#.........#..........#.#.....##.#.#......
|
||||
.#.......##.....#....#...............#....##.......................#..................................#..#.........................
|
||||
..#.#.....#........#.........................#................#..............#.................#.......#...#....#.#..#....#..#.....
|
||||
.......##.........#..............#.........##..#..............#.....#....................#.#..........#..#.#.#....#.......#......#.
|
||||
.#......##..............#..........#..........#.....................#.##..........##.....#...#...#......#...#......#..#..........#.
|
||||
....#.........##......#.#.#...#................#.............#..........................#..............#...............#........#..
|
||||
........##......#..##.....#..#..#.............##.........................#.......#.###....#..#................#....................
|
||||
...#..#.#..........##...#..#....#...........#........................#...#...............#....#.....#......#....#....#....#........
|
||||
.........#.......................#.....#..##............##.#.#.#...#.....#.#...........#.#............#..##...##..............#....
|
||||
.#.#..#.#......#.........#...#..#.......#.#..............##.......##...................#....#........##....##..........#.........#.
|
||||
...................#.....#..#.....#....###...............#........#......#..#.........#.##.#.#......##..#.....#.#...............##.
|
||||
.#..#.........##....#...#..........##...#..............#...#........##...#...............#...............##.....#..................
|
||||
....#.......#...................#...................................#..#...#..#..................#.##..###.......#..#........##....
|
||||
.#.......................###.....#......................#.#.....#...#..##...#.#...........#.....###............####...........#.#..
|
||||
...#.........#........................#..............#..#.#..............#................#......#..#.##...............##..........
|
||||
.....#..........#......#....#....................#.#..........#.#...........#.#.##.............#..#......#..#......#...##...#......
|
||||
...#..........#.............#.....................#......................#.......................#.............#.....#.............
|
||||
..............................#..##...................#...#...............#.#....#....................#.......#..............##....
|
||||
.#...##.....#.....#..#...#........#..............#.#...#.....#.......#..##..#.................#......................#..##.........
|
||||
....#....................#......#...#...........#.........#.......#..#.#...........#......................................#...#....
|
||||
..#.#.........##.....#........#...............#.##......##...........#........#.......................#..#.....#...............#...
|
||||
..##............#........#.....#..#.......#......##...#.#......#......##.............#..........#..#........#..#...............#...
|
||||
........#...##.......#....#...............##....#.....#.#...#....................#...#...........#...#.....##..........#...........
|
||||
.#.#.....................##...#.........#............#..#.......#.#....#....#...#..#....#.............#.#.........#................
|
||||
...........#..........#..#.#...#....................#.................#.##...#.......#.#......................#..#..#.....##.......
|
||||
...#...#.......##.....#...##...........#............#..................#..#...#.#...#......................#....#...#..........#...
|
||||
....#..#.....................#.......##.###......#............##....#..#.......##..........##...............##....#...#.........#..
|
||||
.................#...#.....#..........#...........#..#............#..#...#..#..#....#.#.......#..............#.#......##...........
|
||||
...#.....................#.........#.#..............#....#....###....##......#......##..................#...........#......#.......
|
||||
..#..#............#.#..#..........#...#....#.............#......#......#...#........#.#.###..##..........#.#.........#...#..#....#.
|
||||
.........#............................#.....#.....#...#...#...##......#.......#.#.#....##.#....#.#.......#...#..#.#.......###.#....
|
||||
.#....#.#......#.......#........##....#....#..#..#.##........#....#.........##............#......#..............##...#..........#..
|
||||
..#..#..#....#.......#.#.......#...........#..........#.......##..#..........#............#.......................#...#............
|
||||
........#.#........#...............##..#....##...##....#..#....#........#.................#..................#.##.#.......##.......
|
||||
..........#....###.##.............#.#.#......#........#........#....#.............#.##........#......................#.#.......##..
|
||||
........#........#.#..........##..#.#....#.........##..........#..........#..........#....#.#.........#.......#.....#...##......#..
|
||||
...............#..................#.#.##......#..#..##....#..........#...#......#..#..#.....#...##...............##............#...
|
||||
............#.................#.........#....#......#.............#........#.......#.#...#........#..............##.........#....#.
|
||||
...#....#..#...............#...........#.#.....#.......#.................#.#........#..#.#....#.......................###..........
|
||||
............#.............#......#...#..#..#.......#.###..###...............#...........#...........##....................##.##..#.
|
||||
........................#.#..#..#..##.#.#....#......#..#..#.....#.#..............#......#..........................................
|
||||
.#.#.....................#..#...##..........##.#..#..#.##..#................#..##....#........#....#.#.#.........................#.
|
||||
...#.....................#.....#...#...#....##....#...............................#...#.#................#..#...........#..........
|
||||
...#....#............#.#.........#.......##.......#....................#.........#......#...........#....#...#.............#..##...
|
||||
..#......................#.......#....#.#....##....#......#..........#....#.#.##..#.#.....#...##...#.##..###...........#...#....#..
|
||||
..................#..........#.........#........................#.##...............#...#...#.#............#........................
|
||||
........#.................#.....#..#.............#...#.#.##.......#.............#.#........#...#..#...........#..................#.
|
||||
...#................#.#.#.........#.......#....#.........##........##...###.............#..#.#...#.................................
|
||||
.....#.............##.##...##.............#.......#.#........##......#...#.......##.#.....................#......#.#.......#..##...
|
||||
.........................#.............#...................##...#.......#.....#.........#..#......#.#.#........#.#..............##.
|
||||
.............#......#..................#...............#...........#...#..........#.....#.....##....#.#...#...#.#.............#....
|
||||
..............#....#............##...##....................#............#....#.##....#.##..#.#....#............#..#...........##...
|
||||
........................#..................##..#.......#......#....#..............###........##.........#...#.....#.#............#.
|
||||
..........#.............#..#.............#...........#..##........#........#..#................#......................#.........##.
|
||||
.............#..#.....#..#....#...#.....#....#.#.....##...............#......................#.............#......#...#............
|
||||
..........#...................#.......#............#....#.........#.............#..............#.#..........##.#........#..........
|
||||
.............................#...........#...........##..#.#......#....#.....#....#..#...............##.#.....#...........#........
|
||||
........................#.#.#.......#.##.....##......#....#..........##.........#...............#.#..#.##.....#....#..#............
|
||||
......#....##...............#..#....#...#.....#......#....#.............#.#........#.#.....#.#.....###.#.........#...#...#...#.....
|
||||
.................................................................S.................................................................
|
||||
.....#.#...#...............#.....##......#..........#....#...............#.......#..............#.#.................#..............
|
||||
................##.#..#..........#.#...#......................#..............#...........#...#..#.....##.........#.................
|
||||
.......#.#........#.#...........#........#...........#..#.#.............#............#..........#.....#...................#........
|
||||
..............#..#.................#..#........###..#.......................##.##..........#....#..#...#.##..#.#.###....#..........
|
||||
.............#.....#.....#.........#..#.......#.......#......#..........#.........#............................#.....#.............
|
||||
..#.......#....##.......#................#.#...........#...#..###.#........#........#.#...#............#.......#.#...#.............
|
||||
............#.........#..#....#........#...#.........#...#............#............#....#..#.................#.#......#........#...
|
||||
...#.............#....................#.............#..............#..#..................#...#...#.#....#...#.##....##..........#..
|
||||
....#........#..##..........##.....#.....#....................#..........#...........#.#......##................##...........#.....
|
||||
......#.......#..#..#...##...#................#.#.......#......##.#......#..#..............#....#.....#..#....#.#...#...........#..
|
||||
.....#.......................#..#..........#..........#........#......#...#..#..#...........................#......#..........#..#.
|
||||
.....##...........#....#.........#.........##...................#.#..##.#..#..##.#..##...........#......#....#...##.............#..
|
||||
.#......................#.#..##..#...#.........#.........##.......##.....##.............#.........#.......#...................##.#.
|
||||
...................#....#..###..#...#.....#......#..............#.........#..................##.##.................................
|
||||
......#....#.............#..#...#..##.#...#...#......#....#...........#....#...........##....#..#...#.....#......................#.
|
||||
...#...#............#....#..#.#....................................#..#.....................#....#.........................#.......
|
||||
.......#.............................#............#......................#...#......#.......###.........#...................#.#....
|
||||
.......#................##...#...........##........#..#..#..............#.....#..............#.....#......#..........#...#.........
|
||||
......#.....#.................#....#...........#..........................#..#.##.#.##.............##.#............#....##..#......
|
||||
....#.....#.......................#..............#......#..........#.....##..#.....#.........#..........................#.#..#...#.
|
||||
...#...........#.........#......##...#......#......#....#....#..#......#..#........#..#......................................#.#...
|
||||
.....#...##.....................#.............##..#....#.#..#...#...#....#.........#.......#.....#.............................#...
|
||||
..............###.##...........#..#.##.....#.#..#....#..............#..#..........................#.##.#...........#...............
|
||||
.......#.........................#................##.#.....##........#.....#.#......#..........................#...........#...#...
|
||||
........##...#..#....#...........#....#.........#......#..##..#...........................#...#..............#........#......#.....
|
||||
...#.....#...#.......#..................#.....#...........#................#......#........#.#.#.......................#...........
|
||||
.#..#..#.............###........................#.......#....#.........#.....#........#..#.#....#..........#...#...................
|
||||
......................#...........###........#........#...#.........#..................#...#.....##.........#.............#..#.#...
|
||||
...#.##.............####.........##..#...#........................................#..........#...................#.##..............
|
||||
......#...#.....#..................##........#...........#.#...#....##.......#......#.....#..#.............#..#.#.##....##.........
|
||||
.......#..................#........#........#.........##.#............#.....#....#....#..##..............#.......#.#....#..#.......
|
||||
..........#...........#..................#...........#.....#......##........##.......#.........................................##..
|
||||
...#......#................#...........###..#.........#.....##..#.#...............#....#.##.#........#...................#.........
|
||||
........#...#..##...#.................#......##.......##.....#..#.........#.#....#.......#...........#..#...................#...##.
|
||||
........#...........#.##..............................................##...#..............##...........#..#...###........#.....#...
|
||||
....#.......#....#......................#.#.#......................#....#.........#.......................#....#.#.##...........#..
|
||||
.#................#.#.#.#.................#.......................##.#......#.....#..#..............#....#...#.#...#..#........#...
|
||||
..#.........#.......#.....#.....##.............#.....................#...........#...#.................##.........#....#.........#.
|
||||
....#..#..............#.#...................#...#......#.##..........#.........#..#.......................#..##....................
|
||||
........#..#.#.........#...##.................#......#...#..............#.....................#...#.....#..........#....#...#.#....
|
||||
.#.....#...#..##.......#...#.......#...............................#..#.....#................##..##.......#.......#..#..#........#.
|
||||
..............................###..............................#....#..#....#.#..#.............#...#..........#.#.#.........##.....
|
||||
.......#........#.#................#...#.........#.##.#....................#...................#..#....#...#.....###.....#.#.......
|
||||
.........#.#............#......#......#.#.........###.#.#..#..#.#....#...###....#............#.....................#......#....#...
|
||||
..##...#...#.#...........#.....#...#.......................................#..........................#.........#..##.........#.#..
|
||||
.....#.....#..............#.......................#.........#...#..#.....##................#.#.......#..#...#.#.#..............#.#.
|
||||
.........#....#.#...#.....#......#.#.................#...#...#.........................#..#....#...#.........#...#...#......###....
|
||||
.....#.#..#........#.....##..#.##.....##............................#..#.....#.........#.....##.#..##...#.#.....#.............#....
|
||||
.....#..................#....###.#.#.....#........................#...##....#.........#..........................#....##.#....#..#.
|
||||
...###........##....#....#...#.......#....#..#.........##................#..........#........##.##.................#......#........
|
||||
....#.......##..#.......##...#.........###....#........................#.#.#..................#...#.#.........................#....
|
||||
..##..................#..#........##...#...#..#..............#.......#..............##.......#.........#..#.....................#..
|
||||
.......#.................#....#.#........###..##..................#...............#......#.#............#...#.............#........
|
||||
.#.#..........###.......##..#.#......#..#..#.#...#.............##.#.#...............##..#....#..#..............#.............#.....
|
||||
.....#.#.....#..#..................###...............................................##............##..............................
|
||||
...........#......#..##.#..#...#...#.#.....##.#.....#........##.................#..#..#....#.....#.....#......#.#..................
|
||||
....#....................#...........#.......#..#.............#...#...................##............#..............##..............
|
||||
.........#.#........#..#....#..........#.....#........................................#........#...#..#....#.......#.........#.....
|
||||
...#............#.....#....#....#.....#....#....#..#................................#..#....#.........#.........#.#...........#....
|
||||
.............#.......#...........#..#.....#.....................................#.#...#...#........#..##..#.....#.........#........
|
||||
......#.......#.................#.................#.#.#.................................#........#...........#....#.#..............
|
||||
.##.##....................#...#.#.............###........#.................#..#.....#..#.......#..............#..#.....#.##........
|
||||
........#........#.............#..#...#.#........#..#.....#.............#.....#...#....#...###....##..#.....#..#.....#.............
|
||||
..#.#...........##.....#.................#....#.....##....................#......#..........##....#..#..#...#..#.............#.....
|
||||
...................................................................................................................................
|
11
2023/input/21/test-1
Normal file
11
2023/input/21/test-1
Normal file
|
@ -0,0 +1,11 @@
|
|||
...........
|
||||
.....###.#.
|
||||
.###.##..#.
|
||||
..#.#...#..
|
||||
....#.#....
|
||||
.##..S####.
|
||||
.##..#...#.
|
||||
.......##..
|
||||
.##.#.####.
|
||||
.##..##.##.
|
||||
...........
|
176
2023/src/bin/day21.rs
Normal file
176
2023/src/bin/day21.rs
Normal file
|
@ -0,0 +1,176 @@
|
|||
#![feature(test)]
|
||||
use std::collections::{HashMap, HashSet, VecDeque};
|
||||
|
||||
use anyhow::Result;
|
||||
use aoc::Solver;
|
||||
|
||||
// -- Runners --
|
||||
fn main() -> Result<()> {
|
||||
Day::solve()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn part1_test1() -> Result<()> {
|
||||
// The example provided uses 6 steps instead of 64, however this should be the correct
|
||||
// answer for 64 steps with the example
|
||||
Day::test(Day::part1, "test-1", 42)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part1_solution() -> Result<()> {
|
||||
Day::test(Day::part1, "input", 3642)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_test1() -> Result<()> {
|
||||
Day::test(Day::part2, "test-1", 1)
|
||||
}
|
||||
|
||||
// Benchmarks
|
||||
extern crate test;
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn part1_bench(b: &mut test::Bencher) {
|
||||
Day::benchmark(Day::part1, b)
|
||||
}
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn part2_bench(b: &mut test::Bencher) {
|
||||
Day::benchmark(Day::part2, b)
|
||||
}
|
||||
}
|
||||
|
||||
// -- Solution --
|
||||
pub struct Day;
|
||||
impl aoc::Solver for Day {
|
||||
type Output1 = usize;
|
||||
type Output2 = usize;
|
||||
|
||||
fn day() -> u8 {
|
||||
21
|
||||
}
|
||||
|
||||
fn part1(input: &str) -> Self::Output1 {
|
||||
let mut queue = Vec::new();
|
||||
let map: HashMap<(isize, isize), char> = input
|
||||
.lines()
|
||||
.enumerate()
|
||||
.flat_map(|(y, line)| {
|
||||
line.chars()
|
||||
.enumerate()
|
||||
.map(|(x, mut c)| {
|
||||
if c == 'S' {
|
||||
queue.push(((x as isize, y as isize), 64));
|
||||
c = '.';
|
||||
}
|
||||
|
||||
((x as isize, y as isize), c)
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
})
|
||||
.collect();
|
||||
|
||||
let mut visited = HashSet::new();
|
||||
let directions = [(-1, 0), (1, 0), (0, -1), (0, 1)];
|
||||
// Depth first
|
||||
while let Some(step) = queue.pop() {
|
||||
// If we have already evaluated this state, do not add it to the queue
|
||||
if visited.contains(&step) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Mark this node as visited
|
||||
visited.insert(step);
|
||||
|
||||
// Check if we have ran out of steps
|
||||
if step.1 == 0 {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Try moving in all directions
|
||||
for direction in directions {
|
||||
let next = (
|
||||
(step.0 .0 + direction.0, step.0 .1 + direction.1),
|
||||
step.1 - 1,
|
||||
);
|
||||
|
||||
// If the tile is free add it to the queue
|
||||
if let Some(&tile) = map.get(&next.0) {
|
||||
if tile == '.' {
|
||||
queue.push(next);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
visited.iter().filter(|step| step.1 == 0).count()
|
||||
}
|
||||
|
||||
fn part2(input: &str) -> Self::Output2 {
|
||||
let height = input.lines().count();
|
||||
let width = input.lines().next().unwrap().chars().count();
|
||||
|
||||
let mut queue = Vec::new();
|
||||
let map: HashMap<(isize, isize), char> = input
|
||||
.lines()
|
||||
.enumerate()
|
||||
.flat_map(|(y, line)| {
|
||||
line.chars()
|
||||
.enumerate()
|
||||
.map(|(x, mut c)| {
|
||||
if c == 'S' {
|
||||
queue.push(((x as isize, y as isize), 500));
|
||||
c = '.';
|
||||
}
|
||||
|
||||
((x as isize, y as isize), c)
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
})
|
||||
.collect();
|
||||
|
||||
let mut visited = HashSet::new();
|
||||
let directions = [(-1, 0), (1, 0), (0, -1), (0, 1)];
|
||||
// Depth first
|
||||
while let Some(step) = queue.pop() {
|
||||
// If we have already evaluated this state, do not add it to the queue
|
||||
if visited.contains(&step) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Mark this node as visited
|
||||
visited.insert(step);
|
||||
|
||||
// Check if we have ran out of steps
|
||||
if step.1 == 0 {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Try moving in all directions
|
||||
for direction in directions {
|
||||
let next = (
|
||||
(step.0 .0 + direction.0, step.0 .1 + direction.1),
|
||||
step.1 - 1,
|
||||
);
|
||||
|
||||
let next_wrapped = (
|
||||
next.0 .0.rem_euclid(width as isize),
|
||||
next.0 .1.rem_euclid(height as isize),
|
||||
);
|
||||
|
||||
// If the tile is free add it to the queue
|
||||
if let Some(&tile) = map.get(&next_wrapped) {
|
||||
if tile == '.' {
|
||||
queue.push(next);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
visited.iter().filter(|step| step.1 == 0).count()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user