diff options
author | Nat Lasseter <user@4574.co.uk> | 2022-12-16 16:51:43 +0000 |
---|---|---|
committer | Nat Lasseter <user@4574.co.uk> | 2022-12-16 16:51:43 +0000 |
commit | 8749296d846741d2da035c0df79faf766d172a10 (patch) | |
tree | b319f807f3da3a47ad07936bd18036834d4058b0 /day16/part1.rb | |
parent | 03ed9fc34c2d6738dcca9fe4bb5c4ccffd587ae1 (diff) |
[WIP] Day16
Diffstat (limited to 'day16/part1.rb')
-rw-r--r-- | day16/part1.rb | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/day16/part1.rb b/day16/part1.rb new file mode 100644 index 0000000..5209fdd --- /dev/null +++ b/day16/part1.rb @@ -0,0 +1,95 @@ +class Valve + def initialize(flow_rate, tunnels) + @flow_rate = flow_rate + @tunnels = tunnels + @distance = {} + @open = false + end + + attr_reader :flow_rate, :tunnels, :distance + + def open? + @open + end + + def open! + @open = true + end +end + +valves = {} +$stdin.readlines.each do |line| + fr = line.scan(/\d+/)[0].to_i + name, *tunnels = line.scan(/[A-Z]{2}/) + valves[name] = Valve.new(fr, tunnels) +end + +valves.each do |k, v| + seen = [k] + v.distance[k] = 0 + q = v.tunnels.map{|nv|[nv, 1]} + until q.empty? + nv, d = q.shift + seen << nv + v.distance[nv] = d if v.distance[nv].nil? + q += valves[nv].tunnels.reject{ |t| seen.include?(t) }.map{ |nv| [nv, d+1] } + end +end + +pointful_valves = valves.select { |k, v| v.flow_rate != 0 }.keys + +at = "AA" +time_rem = 30 +relief = 0 + +loop do + nv = nil + pointful_valves.each do |this| + next if valves[this].open? + nv = this if pointful_valves.map { |that| + ( + valves[that].open? ? + 0 : + (valves[at].distance[this] - valves[at].distance[that] + 1) * + valves[that].flow_rate - valves[this].flow_rate + ) <= 0 + }.all? + end + + break if nv.nil? + time_rem -= valves[at].distance[nv] + time_rem -= 1 + break if time_rem < 0 + puts nv + puts time_rem + valves[nv].open! + relief += (time_rem * valves[nv].flow_rate) + at = nv +end + +pp relief + +exit + + +num_valves = pointful_valves.count + +max_relief = 0 + +pointful_valves.permutation.each do |order| + at = "AA" + num_open = 0 + time_rem = 30 + relief = 0 + until time_rem < 0 || num_open == num_valves + nv = order.shift + time_rem -= valves[at].distance[nv] + time_rem -= 1 + relief += time_rem * valves[nv].flow_rate + at = nv + num_open += 1 + end + max_relief = relief if relief > max_relief +end + +puts max_relief |