[2023][ruby][19.1]
change yrqltqllvwlsvxskpxmqpotlwqwuqkut
commit 0dcef64cd8f232a6e73d3be25e75c36dd55796a1
author Alpha Chen <alpha@kejadlen.dev>
date
parent olmussmm
diff --git a/2023/ruby/day_19.rb b/2023/ruby/day_19.rb
new file mode 100644
index 0000000..69ccba7
--- /dev/null
+++ b/2023/ruby/day_19.rb
@@ -0,0 +1,20 @@
+workflows, parts = ARGF.read.split("\n\n")
+
+Part = Data.define(:x, :m, :a, :s)
+
+parts = parts.lines(chomp: true).map { Part.new(**eval(_1.gsub(?=, ?:))) }
+
+workflows = workflows.scan(/(\w+)\{((?~}))\}/).to_h {|name, rules|
+  rules = rules.split(?,).map {|rule|
+    rule.include?(?:) ? rule.split(?:) : ["true", rule]
+  }
+  [name, rules]
+}
+
+pp parts.select {|part|
+  workflow = "in"
+  until %w[A R].include?(workflow) do
+    workflow = workflows.fetch(workflow).find {|cond,_| part.instance_eval(cond) }.last
+  end
+  workflow == ?A
+}.sum { _1.instance_eval { x + m + a + s }}