1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | class Prog024 OPERATORS = {'~' => 1, '+' => 0, '-' => 0, '*' => 0} def initialize(input_str) @input = '(' + input_str + ')' @operand_stack = [] @operator_stack = [] end def evaluate_simple_expr operator = @operator_stack.delete_at(-1) opnd1 = @operand_stack.delete_at(-1) if operator == '~' @operand_stack << -opnd1 else opnd2 = @operand_stack.delete_at(-1) if operator == '+' val = opnd2 + opnd1 elsif operator == '-' val = opnd2 - opnd1 elsif operator == '*' val = opnd2 * opnd1 else raise "Unexpected operator #{operator}" if operator != '/' val = opnd2 / opnd1 end @operand_stack << val end end def evaluate_nested_expr while @operator_stack.last != '(' evaluate_simple_expr end @operator_stack.delete_at(-1) end def evaluate_expr i = 0 while i < @input.length prev_ch = (i > 0) ? @input[i - 1] : nil curr_ch = @input[i] # puts "ch = #{curr_ch}, opr = " + @operator_stack.inspect + ", opnd = " + @operand_stack.inspect if curr_ch =~ /[0-9]/ j = (i + 1) while j < @input.length if @input[j] !~ /[0-9]/ break end j += 1 end val = @input[i...j].to_i @operand_stack << val i = j next end if curr_ch == '-' && /[0-9)]/ !~ prev_ch @operator_stack << '~' elsif curr_ch == ')' evaluate_nested_expr elsif curr_ch == '(' @operator_stack << curr_ch elsif curr_ch == '+' || curr_ch == '*' || curr_ch == '-' || curr_ch == '/' while @operator_stack.last != '(' evaluate_simple_expr end @operator_stack << curr_ch else raise "Unsupported operator" unless curr_ch.nil? # @operator_stack << curr_ch end i += 1 end # raise "Unexpected operand stack size" if @operand_stack.length != 1 return @operand_stack[0].to_i end def self.main input = gets.strip.gsub(/\s/, '') prog = Prog024.new(input) res = prog.evaluate_expr puts res.to_s end end if $0 == __FILE__ Prog024.main exit(0) end |
Y2xhc3MgUHJvZzAyNAoJT1BFUkFUT1JTID0geyd+JyA9PiAxLCAnKycgPT4gMCwgJy0nID0+IDAsICcqJyA9PiAwfQoKCWRlZiBpbml0aWFsaXplKGlucHV0X3N0cikKCQlAaW5wdXQgPSAnKCcgKyBpbnB1dF9zdHIgKyAnKScKCQlAb3BlcmFuZF9zdGFjayA9IFtdCgkJQG9wZXJhdG9yX3N0YWNrID0gW10KCWVuZAoKCWRlZiBldmFsdWF0ZV9zaW1wbGVfZXhwcgoJCW9wZXJhdG9yID0gQG9wZXJhdG9yX3N0YWNrLmRlbGV0ZV9hdCgtMSkKCQlvcG5kMSA9IEBvcGVyYW5kX3N0YWNrLmRlbGV0ZV9hdCgtMSkKCQlpZiBvcGVyYXRvciA9PSAnficKCQkJQG9wZXJhbmRfc3RhY2sgPDwgLW9wbmQxCgkJZWxzZQoJCQlvcG5kMiA9IEBvcGVyYW5kX3N0YWNrLmRlbGV0ZV9hdCgtMSkKCQkJaWYgb3BlcmF0b3IgPT0gJysnCgkJCQl2YWwgPSBvcG5kMiArIG9wbmQxCgkJCWVsc2lmIG9wZXJhdG9yID09ICctJwoJCQkJdmFsID0gb3BuZDIgLSBvcG5kMQoJCQllbHNpZiBvcGVyYXRvciA9PSAnKicKCQkJCXZhbCA9IG9wbmQyICogb3BuZDEKCQkJZWxzZQoJCQkJcmFpc2UgIlVuZXhwZWN0ZWQgb3BlcmF0b3IgI3tvcGVyYXRvcn0iIGlmIG9wZXJhdG9yICE9ICcvJwoJCQkJdmFsID0gb3BuZDIgLyBvcG5kMQoJCQllbmQKCQkJQG9wZXJhbmRfc3RhY2sgPDwgdmFsCgkJZW5kCgllbmQKCglkZWYgZXZhbHVhdGVfbmVzdGVkX2V4cHIKCQl3aGlsZSBAb3BlcmF0b3Jfc3RhY2subGFzdCAhPSAnKCcKCQkJZXZhbHVhdGVfc2ltcGxlX2V4cHIKCQllbmQKCQlAb3BlcmF0b3Jfc3RhY2suZGVsZXRlX2F0KC0xKQoJZW5kCgoJZGVmIGV2YWx1YXRlX2V4cHIKCQlpID0gMAoJCXdoaWxlIGkgPCBAaW5wdXQubGVuZ3RoCgkJCXByZXZfY2ggPSAoaSA+IDApID8gQGlucHV0W2kgLSAxXSA6IG5pbAoJCQljdXJyX2NoID0gQGlucHV0W2ldCgkJCSMgcHV0cyAiY2ggPSAje2N1cnJfY2h9LCBvcHIgPSAiICsgQG9wZXJhdG9yX3N0YWNrLmluc3BlY3QgKyAiLCBvcG5kID0gIiArIEBvcGVyYW5kX3N0YWNrLmluc3BlY3QKCQkJaWYgY3Vycl9jaCA9fiAvWzAtOV0vCgkJCQlqID0gKGkgKyAxKQoJCQkJd2hpbGUgaiA8IEBpbnB1dC5sZW5ndGgKCQkJCQlpZiBAaW5wdXRbal0gIX4gL1swLTldLwoJCQkJCQlicmVhawoJCQkJCWVuZAoJCQkJCWogKz0gMQoJCQkJZW5kCgkJCQl2YWwgPSBAaW5wdXRbaS4uLmpdLnRvX2kKCQkJCUBvcGVyYW5kX3N0YWNrIDw8IHZhbAoJCQkJaSA9IGoKCQkJCW5leHQKCQkJZW5kCgoJCQlpZiBjdXJyX2NoID09ICctJyAmJiAvWzAtOSldLyAhfiBwcmV2X2NoCgkJCQlAb3BlcmF0b3Jfc3RhY2sgPDwgJ34nCgkJCWVsc2lmIGN1cnJfY2ggPT0gJyknCgkJCQlldmFsdWF0ZV9uZXN0ZWRfZXhwcgoJCQllbHNpZiBjdXJyX2NoID09ICcoJwoJCQkJQG9wZXJhdG9yX3N0YWNrIDw8IGN1cnJfY2gKCQkJZWxzaWYgY3Vycl9jaCA9PSAnKycgfHwgY3Vycl9jaCA9PSAnKicgfHwgY3Vycl9jaCA9PSAnLScgfHwgY3Vycl9jaCA9PSAnLycKCQkJCXdoaWxlIEBvcGVyYXRvcl9zdGFjay5sYXN0ICE9ICcoJwoJCQkJCWV2YWx1YXRlX3NpbXBsZV9leHByCgkJCQllbmQKCQkJCUBvcGVyYXRvcl9zdGFjayA8PCBjdXJyX2NoCgkJCWVsc2UKCQkJCXJhaXNlICJVbnN1cHBvcnRlZCBvcGVyYXRvciIgdW5sZXNzIGN1cnJfY2gubmlsPwoJCQkJIyBAb3BlcmF0b3Jfc3RhY2sgPDwgY3Vycl9jaAoJCQllbmQKCQkJaSArPSAxCgkJZW5kCgoJCSMgcmFpc2UgIlVuZXhwZWN0ZWQgb3BlcmFuZCBzdGFjayBzaXplIiBpZiBAb3BlcmFuZF9zdGFjay5sZW5ndGggIT0gMQoJCXJldHVybiBAb3BlcmFuZF9zdGFja1swXS50b19pCgllbmQKCglkZWYgc2VsZi5tYWluCgkJaW5wdXQgPSBnZXRzLnN0cmlwLmdzdWIoL1xzLywgJycpCgkJcHJvZyA9IFByb2cwMjQubmV3KGlucHV0KQoJCXJlcyA9IHByb2cuZXZhbHVhdGVfZXhwcgoJCXB1dHMgcmVzLnRvX3MKCWVuZAplbmQKCmlmICQwID09IF9fRklMRV9fCglQcm9nMDI0Lm1haW4KCWV4aXQoMCkKZW5k


