Fail day 16
Here's my attempt anyways.
This commit is contained in:
parent
3e6bc1d0f6
commit
1ef6143895
3 changed files with 176 additions and 0 deletions
55
input/16
Normal file
55
input/16
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
Valve SW has flow rate=0; tunnels lead to valves LX, LD
|
||||||
|
Valve VS has flow rate=0; tunnels lead to valves JO, OO
|
||||||
|
Valve OO has flow rate=10; tunnels lead to valves KK, HD, VS, KI
|
||||||
|
Valve DZ has flow rate=8; tunnels lead to valves KV, GX, WQ, BA, PK
|
||||||
|
Valve GX has flow rate=0; tunnels lead to valves AA, DZ
|
||||||
|
Valve IF has flow rate=0; tunnels lead to valves OI, DW
|
||||||
|
Valve BO has flow rate=0; tunnels lead to valves UJ, ZT
|
||||||
|
Valve KI has flow rate=0; tunnels lead to valves OO, KU
|
||||||
|
Valve JT has flow rate=3; tunnels lead to valves FC, AM, KV, XP, XZ
|
||||||
|
Valve TQ has flow rate=0; tunnels lead to valves AA, DW
|
||||||
|
Valve KK has flow rate=0; tunnels lead to valves QW, OO
|
||||||
|
Valve NR has flow rate=0; tunnels lead to valves UG, XM
|
||||||
|
Valve VO has flow rate=0; tunnels lead to valves YR, AA
|
||||||
|
Valve MS has flow rate=17; tunnels lead to valves LT, LX
|
||||||
|
Valve JO has flow rate=0; tunnels lead to valves YR, VS
|
||||||
|
Valve ZB has flow rate=0; tunnels lead to valves UJ, LT
|
||||||
|
Valve ZT has flow rate=0; tunnels lead to valves XM, BO
|
||||||
|
Valve YR has flow rate=9; tunnels lead to valves VO, FY, WB, JO
|
||||||
|
Valve QS has flow rate=0; tunnels lead to valves QW, FY
|
||||||
|
Valve UD has flow rate=0; tunnels lead to valves CA, JB
|
||||||
|
Valve AP has flow rate=0; tunnels lead to valves CA, DW
|
||||||
|
Valve KV has flow rate=0; tunnels lead to valves JT, DZ
|
||||||
|
Valve JH has flow rate=0; tunnels lead to valves IK, UJ
|
||||||
|
Valve LD has flow rate=15; tunnels lead to valves IK, SW
|
||||||
|
Valve XK has flow rate=0; tunnels lead to valves XZ, BH
|
||||||
|
Valve XM has flow rate=11; tunnels lead to valves XP, CJ, ZT, NR
|
||||||
|
Valve FY has flow rate=0; tunnels lead to valves YR, QS
|
||||||
|
Valve GI has flow rate=22; tunnel leads to valve TI
|
||||||
|
Valve JB has flow rate=14; tunnels lead to valves WB, UD, WQ, HD
|
||||||
|
Valve DW has flow rate=6; tunnels lead to valves AP, TQ, NQ, IF, PK
|
||||||
|
Valve UJ has flow rate=13; tunnels lead to valves JH, ZB, BO
|
||||||
|
Valve KU has flow rate=0; tunnels lead to valves CA, KI
|
||||||
|
Valve WQ has flow rate=0; tunnels lead to valves JB, DZ
|
||||||
|
Valve BA has flow rate=0; tunnels lead to valves BH, DZ
|
||||||
|
Valve AA has flow rate=0; tunnels lead to valves YX, TQ, VO, GX, QP
|
||||||
|
Valve TI has flow rate=0; tunnels lead to valves GI, UG
|
||||||
|
Valve FC has flow rate=0; tunnels lead to valves QP, JT
|
||||||
|
Valve CA has flow rate=18; tunnels lead to valves KU, UD, AP
|
||||||
|
Valve QW has flow rate=25; tunnels lead to valves QS, KK
|
||||||
|
Valve XZ has flow rate=0; tunnels lead to valves JT, XK
|
||||||
|
Valve YX has flow rate=0; tunnels lead to valves AA, CJ
|
||||||
|
Valve OI has flow rate=0; tunnels lead to valves IF, BH
|
||||||
|
Valve NQ has flow rate=0; tunnels lead to valves AM, DW
|
||||||
|
Valve QP has flow rate=0; tunnels lead to valves AA, FC
|
||||||
|
Valve AM has flow rate=0; tunnels lead to valves NQ, JT
|
||||||
|
Valve XP has flow rate=0; tunnels lead to valves XM, JT
|
||||||
|
Valve BH has flow rate=12; tunnels lead to valves BA, XK, OI
|
||||||
|
Valve HD has flow rate=0; tunnels lead to valves OO, JB
|
||||||
|
Valve LT has flow rate=0; tunnels lead to valves MS, ZB
|
||||||
|
Valve LX has flow rate=0; tunnels lead to valves MS, SW
|
||||||
|
Valve CJ has flow rate=0; tunnels lead to valves XM, YX
|
||||||
|
Valve PK has flow rate=0; tunnels lead to valves DW, DZ
|
||||||
|
Valve IK has flow rate=0; tunnels lead to valves LD, JH
|
||||||
|
Valve WB has flow rate=0; tunnels lead to valves YR, JB
|
||||||
|
Valve UG has flow rate=21; tunnels lead to valves TI, NR
|
10
input/16-test
Normal file
10
input/16-test
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
|
||||||
|
Valve BB has flow rate=13; tunnels lead to valves CC, AA
|
||||||
|
Valve CC has flow rate=2; tunnels lead to valves DD, BB
|
||||||
|
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
|
||||||
|
Valve EE has flow rate=3; tunnels lead to valves FF, DD
|
||||||
|
Valve FF has flow rate=0; tunnels lead to valves EE, GG
|
||||||
|
Valve GG has flow rate=0; tunnels lead to valves FF, HH
|
||||||
|
Valve HH has flow rate=22; tunnel leads to valve GG
|
||||||
|
Valve II has flow rate=0; tunnels lead to valves AA, JJ
|
||||||
|
Valve JJ has flow rate=21; tunnel leads to valve II
|
111
src/bin/16.rs
Normal file
111
src/bin/16.rs
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use aoc2022::*;
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
const INPUT: &str = include_str!("../../input/16");
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("This does not work :(");
|
||||||
|
let mut cave = Cave::new();
|
||||||
|
solved_level_1(cave.level1());
|
||||||
|
}
|
||||||
|
|
||||||
|
type Str = &'static str;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Valve {
|
||||||
|
id: Str,
|
||||||
|
rate: i64,
|
||||||
|
tunnels: Vec<Str>,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Cave {
|
||||||
|
valves: HashMap<Str, Valve>,
|
||||||
|
distance_cache: HashMap<(Str, Str), i64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Cave {
|
||||||
|
fn level1(&mut self) -> i64 {
|
||||||
|
let mut remaining = self
|
||||||
|
.valves
|
||||||
|
.keys()
|
||||||
|
.cloned()
|
||||||
|
.filter(|&k| k != "AA")
|
||||||
|
.collect_vec();
|
||||||
|
|
||||||
|
self.level1_rec("AA", &mut remaining, 30)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn level1_rec(&mut self, at: Str, remaining: &mut Vec<Str>, time: i64) -> i64 {
|
||||||
|
let mut other_releases = Vec::new();
|
||||||
|
|
||||||
|
for _ in 0..remaining.len() {
|
||||||
|
let next = remaining.remove(0);
|
||||||
|
|
||||||
|
let time = time - self.distance(at, next, 0) - 1;
|
||||||
|
if time > 0 {
|
||||||
|
other_releases.push(self.level1_rec(next, remaining, time));
|
||||||
|
}
|
||||||
|
|
||||||
|
remaining.push(next);
|
||||||
|
}
|
||||||
|
|
||||||
|
let release = self.valves[at].rate * time;
|
||||||
|
release + other_releases.into_iter().max().unwrap_or(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn distance(&mut self, from: Str, to: Str, stopper: usize) -> i64 {
|
||||||
|
if from == to {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if let Some(d) = self.distance_cache.get(&(from, to)) {
|
||||||
|
return *d;
|
||||||
|
}
|
||||||
|
if let Some(d) = self.distance_cache.get(&(to, from)) {
|
||||||
|
return *d;
|
||||||
|
}
|
||||||
|
if self.valves[from].tunnels.contains(&to) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if stopper > 30 {
|
||||||
|
return 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find recursively via neighbors.
|
||||||
|
let mut distances = Vec::new();
|
||||||
|
for neighbor in self.valves[from].tunnels.clone() {
|
||||||
|
let d = self.distance(neighbor, to, stopper + 1);
|
||||||
|
distances.push(d + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let best = distances.into_iter().min().unwrap();
|
||||||
|
self.distance_cache.insert((from, to), best);
|
||||||
|
best
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new() -> Self {
|
||||||
|
let valves = INPUT
|
||||||
|
.lines()
|
||||||
|
.map(|line| {
|
||||||
|
let parts = line.split(' ').collect_vec();
|
||||||
|
let id = parts[1];
|
||||||
|
let rate = parts[4].split_once('=').unwrap().1;
|
||||||
|
let rate = rate.strip_suffix(';').unwrap_or(rate).parse().unwrap();
|
||||||
|
|
||||||
|
let tunnels = parts
|
||||||
|
.iter()
|
||||||
|
.skip(9)
|
||||||
|
.map(|part| part.strip_suffix(',').unwrap_or(part))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Valve { id, rate, tunnels }
|
||||||
|
})
|
||||||
|
.map(|v| (v.id, v))
|
||||||
|
.collect();
|
||||||
|
Self {
|
||||||
|
valves,
|
||||||
|
distance_cache: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue