[2021][ruby][8.x]
change ukouluqrvnryywvsqmsoutrqrqquuulm
commit fd492d0ab58e49018647b164a89cb381bd3f03db
author Alpha Chen <alpha@kejadlen.dev>
date
parent qlyztvmt
diff --git a/2021/ruby/day_08.rb b/2021/ruby/day_08.rb
new file mode 100644
index 0000000..c173e03
--- /dev/null
+++ b/2021/ruby/day_08.rb
@@ -0,0 +1,42 @@
+require "set"
+
+input = ARGF.read.split("\n").map {|x| x.split(/\s+\|\s+/).map {|x| x.split(/\s+/) } }
+# output = input.map(&:last)
+# p output.flatten.count {|x| [2, 4, 3, 7].include?(x.length) }
+
+MAP = {
+  %w[ a b c   e f g ] => 0,
+  %w[     c     f   ] => 1,
+  %w[ a   c d e   g ] => 2,
+  %w[ a   c d   f g ] => 3,
+  %w[   b c d   f   ] => 4,
+  %w[ a b   d   f g ] => 5,
+  %w[ a b   d e f g ] => 6,
+  %w[ a   c     f   ] => 7,
+  %w[ a b c d e f g ] => 8,
+  %w[ a b c d   f g ] => 9,
+#     8 6 8 7 4 9 7
+}.transform_keys(&:to_set)
+
+def solve(signals, output)
+  all = signals + output
+  one = all.find {|x| x.length == 2 }
+  four = all.find {|x| x.length == 4 }
+  seven = all.find {|x| x.length == 3 }
+  eight = all.find {|x| x.length == 7 }
+
+  b = (?a..?g).find {|x| signals.count {|s| s.include?(x) } == 6 }
+  e = (?a..?g).find {|x| signals.count {|s| s.include?(x) } == 4 }
+  f = (?a..?g).find {|x| signals.count {|s| s.include?(x) } == 9 }
+
+  a = (seven.chars - one.chars)[0]
+  c = (one.chars - [f])[0]
+  d = (four.chars - [b, c, f])[0]
+  g = (eight.chars - [a, b, c, d, e, f])[0]
+
+  map = { a: a, b: b, c: c, d: d, e: e, f: f, g: g }.invert
+
+  output.map {|x| MAP.fetch(x.chars.map {|c| map.fetch(c).to_s }.to_set) }.join.to_i
+end
+
+p input.sum {|x| solve(*x) }