chiark / gitweb /
16b done
authorBen Harris <bjh21@bjh21.me.uk>
Tue, 21 May 2024 19:10:31 +0000 (21:10 +0200)
committerBen Harris <bjh21@bjh21.me.uk>
Tue, 21 May 2024 19:10:31 +0000 (21:10 +0200)
A little light memoization did the trick (but 27s CPU time!)

16/16b.bqn [new file with mode: 0644]

diff --git a/16/16b.bqn b/16/16b.bqn
new file mode 100644 (file)
index 0000000..5e2b566
--- /dev/null
@@ -0,0 +1,59 @@
+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