From b727f41bd09775d4cc647cfee9bd87c1342dfe51 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Wed, 16 Dec 2020 21:34:36 -0800 Subject: [PATCH] [2020][ruby][16.x] --- 2020/ruby/day_16.rb | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 2020/ruby/day_16.rb diff --git a/2020/ruby/day_16.rb b/2020/ruby/day_16.rb new file mode 100644 index 0000000..30bda94 --- /dev/null +++ b/2020/ruby/day_16.rb @@ -0,0 +1,65 @@ +require "strscan" + +ss = StringScanner.new(ARGF.read) + +rules = {} +mine = [] +nearby = [] + +while ss.scan(/([\w\s]+): (\d+)-(\d+) or (\d+)-(\d+)\n/) + c = ss.captures + field = c.shift + rules[field] = c.map(&:to_i).each_slice(2).map {|a,b| a..b } +end +ss.scan(/\n/) + +ss.scan(/your ticket:\n/) +mine = ss.scan(/(?~\n)\n/).scan(/\d+/).map(&:to_i) + +ss.scan(/\nnearby tickets:\n/) +nearby = ss.rest.split("\n").map {|line| line.split(?,).map(&:to_i) } + +# part one +# p nearby.flat_map {|fields| +# fields.reject {|field| +# rules.values.any? {|values| values.any? {|range| range.cover?(field) }} +# } +# }.sum + +nearby.select! {|fields| + fields.all? {|field| + rules.values.any? {|values| values.any? {|range| range.cover?(field) }} + } +} + +valid = (0...mine.size).map {|i| + rules.select {|name, ranges| + nearby.map {|n| n[i] }.all? {|n| ranges.any? {|range| range.cover?(n) }} + } +}.map.with_index {|v,i| [i, v.keys] }.to_h + +order = {} +until valid.values.all?(&:empty?) + k, f = valid.find {|_,v| v.size == 1 } + order[k] = f[0] + valid.transform_values! {|v| v - f } +end + +p order + .select {|_,v| v.start_with?("departure") } + .map(&:first) + .map {|i| mine[i] } + .inject(&:*) + +# order = rules.to_a.permutation(rules.size) +# }.find {|order| +# order.map(&:last).each.with_index.all? {|values,i| +# nearby.all? {|n| +# values.any? {|range| range.cover?(n[i]) } +# } +# } +# } + +# p order.map(&:first).zip(mine).select {|o,_| +# o.start_with?("departure") +# }.inject {|a,b| a * b }