Skip to content

Commit

Permalink
Adding a better solution for Day 23 that runs in 12s rather than 8 hours
Browse files Browse the repository at this point in the history
  • Loading branch information
johnhurt committed Jan 4, 2024
1 parent ad44171 commit bc1e585
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 34 deletions.
58 changes: 29 additions & 29 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,35 +39,35 @@ Solutions for [Advent of Code](https://adventofcode.com/) in [Rust](https://www.
<!--- benchmarking table --->
## Benchmarks

| Day | Part 1 | Part 2 |
| :-----------------------: | :-------: | :--------------: |
| [Day 1](./src/bin/01.rs) | `31.9µs` | `375.3µs` |
| [Day 2](./src/bin/02.rs) | `100.6µs` | `100.3µs` |
| [Day 3](./src/bin/03.rs) | `8.5ms` | `9.4ms` |
| [Day 4](./src/bin/04.rs) | `261.0µs` | `300.1µs` |
| [Day 5](./src/bin/05.rs) | `26.6µs` | `97.9µs` |
| [Day 6](./src/bin/06.rs) | `572.0ns` | `1.0µs` |
| [Day 7](./src/bin/07.rs) | `636.9µs` | `660.6µs` |
| [Day 8](./src/bin/08.rs) | `792.2µs` | `7.0ms` |
| [Day 9](./src/bin/09.rs) | `490.3µs` | `492.6µs` |
| [Day 10](./src/bin/10.rs) | `164.8µs` | `3.9ms` |
| [Day 11](./src/bin/11.rs) | `5.3ms` | `5.4ms` |
| [Day 12](./src/bin/12.rs) | `1.3ms` | `24.3ms` |
| [Day 13](./src/bin/13.rs) | `194.5µs` | `196.7µs` |
| [Day 14](./src/bin/14.rs) | `397.3µs` | `332.5ms` |
| [Day 15](./src/bin/15.rs) | `67.7µs` | `359.8µs` |
| [Day 16](./src/bin/16.rs) | `3.7ms` | `989.8ms` |
| [Day 17](./src/bin/17.rs) | `110.8ms` | `318.6ms` |
| [Day 18](./src/bin/18.rs) | `687.4µs` | `701.3µs` |
| [Day 19](./src/bin/19.rs) | `327.7µs` | `318.7µs` |
| [Day 20](./src/bin/20.rs) | `3.9ms` | `60.4ms` |
| [Day 21](./src/bin/21.rs) | `1.4ms` | `206.2ms` |
| [Day 22](./src/bin/22.rs) | `9.7ms` | `7.5s` |
| [Day 23](./src/bin/23.rs) | `82.2ms` | `Like 8 hours 😭` |
| [Day 24](./src/bin/24.rs) | `1.1ms` | `??????` |
| [Day 25](./src/bin/25.rs) | `5.6s` | `-` |

**Total: 15.3s (+ 8 hours for 23-P2)**
| Day | Part 1 | Part 2 |
| :---: | :---: | :---: |
| [Day 1](./src/bin/01.rs) | `38.5µs` | `271.4µs` |
| [Day 2](./src/bin/02.rs) | `60.0µs` | `59.3µs` |
| [Day 3](./src/bin/03.rs) | `8.1ms` | `8.6ms` |
| [Day 4](./src/bin/04.rs) | `165.1µs` | `182.6µs` |
| [Day 5](./src/bin/05.rs) | `24.7µs` | `61.8µs` |
| [Day 6](./src/bin/06.rs) | `434.0ns` | `705.0ns` |
| [Day 7](./src/bin/07.rs) | `380.3µs` | `404.8µs` |
| [Day 8](./src/bin/08.rs) | `671.9µs` | `5.6ms` |
| [Day 9](./src/bin/09.rs) | `247.9µs` | `247.9µs` |
| [Day 10](./src/bin/10.rs) | `122.9µs` | `3.1ms` |
| [Day 11](./src/bin/11.rs) | `4.1ms` | `4.0ms` |
| [Day 12](./src/bin/12.rs) | `630.5µs` | `11.6ms` |
| [Day 13](./src/bin/13.rs) | `123.5µs` | `127.2µs` |
| [Day 14](./src/bin/14.rs) | `223.9µs` | `237.7ms` |
| [Day 15](./src/bin/15.rs) | `52.3µs` | `210.8µs` |
| [Day 16](./src/bin/16.rs) | `3.2ms` | `875.6ms` |
| [Day 17](./src/bin/17.rs) | `80.4ms` | `207.8ms` |
| [Day 18](./src/bin/18.rs) | `427.1µs` | `441.9µs` |
| [Day 19](./src/bin/19.rs) | `225.2µs` | `198.7µs` |
| [Day 20](./src/bin/20.rs) | `2.7ms` | `40.8ms` |
| [Day 21](./src/bin/21.rs) | `1.1ms` | `168.3ms` |
| [Day 22](./src/bin/22.rs) | `6.4ms` | `6.0s` |
| [Day 23](./src/bin/23.rs) | `52.9ms` | `12.4s` |
| [Day 24](./src/bin/24.rs) | `1.1ms` | `-` |
| [Day 25](./src/bin/25.rs) | `3.4s` | `-` |

**Total: 23528.70ms**
<!--- benchmarking table --->

---
Expand Down
98 changes: 93 additions & 5 deletions src/bin/23.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::collections::HashSet;
use std::collections::{HashMap, HashSet, VecDeque};

use advent_of_code::{Compass, Grid};

Expand Down Expand Up @@ -38,7 +38,7 @@ impl From<Hike> for char {
}
}

fn max_path(start: usize, end: usize, grid: &Grid<Hike>) -> usize {
fn max_path(start: usize, end: usize, grid: &mut Grid<Hike>) -> usize {
let mut stack = vec![];
stack.push((0, start, HashSet::new()));

Expand Down Expand Up @@ -93,13 +93,101 @@ fn max_path(start: usize, end: usize, grid: &Grid<Hike>) -> usize {
}

pub fn part_one(input: &str) -> Option<usize> {
let grid = Grid::parse_lines(input);
let mut grid = Grid::parse_lines(input);

let result = max_path(1, grid.data.len() - 2, &grid);
let result = max_path(1, grid.data.len() - 2, &mut grid);

Some(result)
}

fn graph_neighbors(
from: usize,
grid: &Grid<Hike>,
nodes: &HashSet<usize>,
) -> HashMap<usize, usize> {
let mut result = HashMap::new();
let mut queue = VecDeque::new();

queue.push_back((from, 0, from));

while let Some((curr, dist, prev)) = queue.pop_front() {
if curr != from && nodes.contains(&curr) {
result.insert(curr, dist);
} else {
queue.extend(
grid.neighbors(curr)
.map(|(_, n)| n)
.filter(|n| grid.data[*n] != Hike::Wall)
.filter(|n| *n != prev)
.map(|n| (n, dist + 1, curr)),
)
}
}

result
}

fn extract_graph(
grid: &Grid<Hike>,
start: usize,
end: usize,
) -> HashMap<usize, HashMap<usize, usize>> {
let nodes = [start, end]
.into_iter()
.chain(
grid.data
.iter()
.enumerate()
.filter(|(_, h)| **h != Hike::Wall)
.map(|(i, _)| i)
.filter(|i| {
grid.neighbors(*i)
.map(|(_, n)| n)
.filter(|n| grid.data[*n] != Hike::Wall)
.count()
> 2
}),
)
.collect::<HashSet<_>>();

nodes
.iter()
.map(|n| (*n, graph_neighbors(*n, grid, &nodes)))
.collect::<HashMap<_, _>>()
}

fn search_simplified(start: usize, end: usize, grid: &mut Grid<Hike>) -> usize {
let simplified = extract_graph(grid, start, end);

let mut stack = vec![];
stack.push((0, start, HashSet::new()));

let mut max_dist = 0;

while let Some((dist, curr, mut hist)) = stack.pop() {
if curr == end {
if dist > max_dist {
max_dist = max_dist.max(dist);
}
continue;
}

if !hist.insert(curr) {
continue;
}

stack.extend(
simplified
.get(&curr)
.unwrap()
.iter()
.map(|(too, add_dist)| (dist + add_dist, *too, hist.clone())),
);
}

max_dist
}

pub fn part_two(input: &str) -> Option<usize> {
let mut grid = Grid::parse_lines(input);

Expand All @@ -109,7 +197,7 @@ pub fn part_two(input: &str) -> Option<usize> {
}
});

let result = max_path(1, grid.data.len() - 2, &grid);
let result = search_simplified(1, grid.data.len() - 2, &mut grid);

Some(result)
}
Expand Down

0 comments on commit bc1e585

Please sign in to comment.