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