[2022][ruby][16.2]
change znowzzmvnrrmonuxymuqkrolrlkynntv
commit e8709af148b9f6df9349a0195899c5911fbf9821
author Alpha Chen <alpha@kejadlen.dev>
date
parent oksmvmkn
diff --git a/2022/ruby/day_16.rb b/2022/ruby/day_16.rb
index 0060213..9a42e1f 100644
--- a/2022/ruby/day_16.rb
+++ b/2022/ruby/day_16.rb
@@ -36,21 +36,20 @@ Move = Data.define(:reward, :target, :path) do
 end
 
 State = Data.define(:net, :current, :max, :turn, :pressure, :opened) do
-  def best_moves
-    best_moves = []
+  def best_moves(best)
     best_state = self
 
+    best[opened] = [best.fetch(opened, pressure), pressure].max
+
     moves.each do |move|
       next_state = applied(move)
-      next_state, next_moves = next_state.best_moves;
-      next_moves << move
+      next_state = next_state.best_moves(best);
       if next_state.pressure > best_state.pressure
-        best_moves = next_moves
         best_state = next_state
       end
     end
 
-    [best_state, best_moves]
+    best_state
   end
 
   def applied(move)
@@ -60,7 +59,7 @@ State = Data.define(:net, :current, :max, :turn, :pressure, :opened) do
       max,
       turn + move.cost,
       pressure + move.reward,
-      opened + [move.target],
+      Set[*opened, move.target],
     )
   end
 
@@ -84,6 +83,21 @@ end
 
 network = Network.new(valves.to_h { [_1.name, _1] })
 
-state = State.new(network, "AA", 30, 0, 0, [])
-best_state, moves = state.best_moves
-pp best_state, moves
+# part 1
+# state = State.new(network, "AA", 30, 0, 0, [])
+# best_state = state.best_moves({})
+# pp best_state
+
+# part 2
+state = State.new(network, "AA", 26, 0, 0, [])
+
+best = {}
+state.best_moves(best)
+
+pp best
+  .transform_keys(&:to_set)
+  .to_a
+  .combination(2)
+  .select { _1[0].disjoint?(_2[0]) }
+  .map { _1[1] + _2[1] }
+  .max