[2020][ruby][18.x]
change okslprvstswprzlspunnlovumuusnqvr
commit a2426929fff8c729735118cbb5fb645a75124f1a
author Alpha Chen <alpha@kejadlen.dev>
date
parent slmymxkz
diff --git a/2020/ruby/day_18.rb b/2020/ruby/day_18.rb
new file mode 100644
index 0000000..50bf8ec
--- /dev/null
+++ b/2020/ruby/day_18.rb
@@ -0,0 +1,32 @@
+require "strscan"
+
+def evaluate(input)
+  while input.include?(?()
+    input = input.gsub(/\((?~[()])+\)/) {|m| evaluate(m[1..-2]) }
+  end
+
+  # ss = StringScanner.new(input)
+  # n = ss.scan(/\d+/).to_i
+  # until ss.eos?
+  #   case
+  #   when ss.scan(/\s*\+\s*(\d+)/)
+  #     n += ss.captures[0].to_i
+  #   when ss.scan(/\s*\*\s*(\d+)/)
+  #     n *= ss.captures[0].to_i
+  #   else
+  #     fail
+  #   end
+  # end
+  # n
+
+  while input.include?(?+)
+    input = input.gsub(/\d+\s*\+\s*\d+/) {|m| eval(m) }
+  end
+  while input.include?(?*)
+    input = input.gsub(/\d+\s*\*\s*\d+/) {|m| eval(m) }
+  end
+  input.to_i
+end
+
+p ARGF.read.split("\n").map {|line| evaluate(line) }.sum
+