--- /dev/null
+Prep←{
+ name⇐2↑6↓𝕩
+ flow⇐•ParseFloat(𝕩∊"0123456789")/𝕩
+ tunnels⇐⟨∘,2⟩⥊3↓(𝕩∊('A'+↕(1+'Z'-'A')))/𝕩
+}
+
+Mem←{𝕊 f:
+ cache←⟨⟩•HashMap⟨⟩
+ {
+ cache.Has 𝕩 ? cache.Get 𝕩;
+ result ← F 𝕩
+ 𝕩 cache.Set result
+ result
+ }
+}
+
+Main←{
+ names←{𝕩.name}¨𝕩
+ flows←{𝕩.flow}¨𝕩
+ tunnelses←{names⊐⥊⋈˘𝕩.tunnels}¨𝕩
+ tunnels←{⊑𝕨∊𝕩⊑tunnelses}⌜˜↕≠𝕩
+ paths←{𝕩(⊢⌊⊏˘+⌜⊏)´↕≠𝕩}(tunnels⊏⟨∞,1⟩) # Stolen from BQNcrate
+ paths 0¨⌾(⋈˜¨∘↕∘≠⊸⊑) ↩ # Every valve zero distance from itself
+ paths +↩1 # Add in time to open destination valve
+ paths
+ aa←⊑names⊐<"AA"
+ nonzero←0<flows
+ Open←{𝕨∨𝕩=↕≠𝕨}
+ SearchMe←{
+ 𝕊⟨time,here,vs⟩:
+ # •Show ⟨time,here,vs⟩
+ ⌈´(SearchElFromStart vs)∾{MoveMe⟨time-⟨here,𝕩⟩⊑paths,𝕩,vs⟩}¨/¬vs
+ }
+ MoveMe←{
+ 𝕊⟨time,·,·⟩: time < 0 ? ¯∞;
+ 𝕊⟨time,here,vs⟩:
+ (time×here⊑flows) + SearchMe⟨time,here,vs Open here⟩
+ }
+ elcache←⟨⟩•HashMap⟨⟩
+ SearchElFromStart←{
+ 𝕊 vs: elcache.Has vs ? elcache.Get vs;
+ 𝕊 vs: result←SearchEl⟨26,aa,vs⟩
+ vs elcache.Set result
+ result
+ }
+ SearchEl←{
+ 𝕊⟨time,here,vs⟩:
+ # •Show ⟨time,here,vs⟩
+ ⌈´⟨0⟩∾{MoveEl⟨time-⟨here,𝕩⟩⊑paths,𝕩,vs⟩}¨/¬vs
+ }
+ MoveEl←{
+ 𝕊⟨time,·,·⟩: time < 0 ? ¯∞;
+ 𝕊⟨time,here,vs⟩:
+ (time×here⊑flows) + SearchEl⟨time,here,vs Open here⟩
+ }
+ SearchMe⟨26,aa,¬nonzero⟩
+}
+
+•Show Main Prep¨ •file.Lines ⊑•args