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