From 5ecce65bb5f11e210ff64d819fa8fc562621a267 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Tue, 22 Dec 2020 10:06:02 -0800 Subject: [PATCH] [2020][ruby][18] playing around --- 2020/ruby/day_18.rb | 74 ++++++++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 24 deletions(-) diff --git a/2020/ruby/day_18.rb b/2020/ruby/day_18.rb index 50bf8ec..daf50a7 100644 --- a/2020/ruby/day_18.rb +++ b/2020/ruby/day_18.rb @@ -1,32 +1,58 @@ require "strscan" -def evaluate(input) - while input.include?(?() - input = input.gsub(/\((?~[()])+\)/) {|m| evaluate(m[1..-2]) } - end +# 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 +# # part one +# # 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) } +# 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 + +def evaluate(input) + stack = [->(x) { x }] + + ss = StringScanner.new(input) + until ss.eos? + ss.scan(/\s*/) + case + when n = ss.scan(/\d+/) + stack << stack.pop[n.to_i] + when ss.scan(/\+/) + stack << ->(x) { stack.pop + x } + when ss.scan(/\*/) + stack << ->(x) { stack.pop * x } + when ss.scan(/\(/) + stack << ->(x) { x } + when ss.scan(/\)/) + n = stack.pop + stack << stack.pop[n] + else + fail + end end - input.to_i + + stack.pop end p ARGF.read.split("\n").map {|line| evaluate(line) }.sum -