diff options
author | Nat Lasseter <Nat Lasseter nathan@bytemark.co.uk> | 2017-12-25 00:44:45 +0000 |
---|---|---|
committer | Nat Lasseter <Nat Lasseter nathan@bytemark.co.uk> | 2017-12-25 00:44:45 +0000 |
commit | 3da21a8a69b5e616bd6f83b2104ba5bddd2f3bbf (patch) | |
tree | 28a0b413af6b762db165ff939801b82e28ddd62f /day24/part2 | |
parent | 11114c033735fc29ddc563de23d41682a6d101e3 (diff) |
Day24 Part2
Diffstat (limited to 'day24/part2')
-rwxr-xr-x | day24/part2 | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/day24/part2 b/day24/part2 new file mode 100755 index 0000000..84494c2 --- /dev/null +++ b/day24/part2 @@ -0,0 +1,62 @@ +#!/usr/bin/env ruby + +input = $stdin.readlines.map(&:chomp).map{|c| c.split('/').map(&:to_i)} + +class BridgeFactory + def initialize(pieces, bridge = [], be = 0) + @pieces = pieces.dup + @bridge = bridge.dup + @be = be + @complete = false + end + + def complete? + return @complete + end + + def build_iter + @complete = true + nexts = get_nexts + return nexts.map do |nxt| + nbe = nxt[0] == nxt[1] ? nxt[0] : (nxt - [@be])[0] + BridgeFactory.new(@pieces - [nxt], @bridge + [nxt], nbe) + end + end + + def strength + return @bridge.flatten.inject(:+) || 0 + end + + def length + return @bridge.length + end + + def to_s + return "(#{strength})\t\"" + @bridge.map {|p| + p.join('/') + }.join('--') + "\"" + end + + private + + def get_nexts + return @pieces.select do |piece| + piece[0] == @be || piece[1] == @be + end + end +end + +bfs = [BridgeFactory.new(input)] + +loop do + new_bfs = [] + bfs.each do |bf| + if !bf.complete? then + new_bfs += bf.build_iter + end + end + break if new_bfs.empty? + bfs = new_bfs +end + +puts bfs.map(&:strength).max |