[2020][ruby][16.x]
change rpskovxnrwlyomqsskwlxtwwxopllqzo
commit ca9d3414ec379a763d61e352b8fd975797418d06
author Alpha Chen <alpha@kejadlen.dev>
date
parent kukxpuys
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 }