fork(1) download
  1. import re
  2.  
  3.  
  4. def tokenize(s):
  5. return re.findall(r'\+|-|\*|=|\d+', s)
  6.  
  7.  
  8. def evaluate(stack):
  9. return eval(''.join(stack))
  10.  
  11.  
  12. def calc(e):
  13. stack = ['0']
  14. for token in tokenize(e):
  15. if token.isdigit():
  16. if stack[-1].isdigit():
  17. stack[-1] = token
  18. else:
  19. stack.append(token)
  20. elif token in '+-*':
  21. if stack[-1] in '+-*':
  22. stack[-1] = token
  23. else:
  24. stack.append(token)
  25. elif token == '=':
  26. stack = [str(evaluate(stack))]
  27. try:
  28. return int(stack[-1])
  29. except ValueError:
  30. return evaluate(stack[:-1])
  31.  
  32.  
  33. def test():
  34. assert calc("5") == 5
  35. assert calc("5+") == 5
  36. assert calc("5+3") == 3
  37. assert calc("5+3=") == 8
  38.  
  39. assert calc("5*-3=") == 2
  40. assert calc("5-3+") == 2
  41. assert calc("5-3*2=") == -1
  42.  
  43. assert calc("") == 0
  44. assert calc("-10=") == -10
  45. assert calc("*10=") == 0
  46.  
  47. assert calc("4+3=2=") == 2
  48. assert calc("4+3=*2=") == 14
  49.  
  50.  
  51. if __name__ == '__main__':
  52. test()
Success #stdin #stdout 0.03s 9984KB
stdin
Standard input is empty
stdout
Standard output is empty