Advertisement
Guest User

Untitled

a guest
Nov 18th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.42 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. from decimal import Decimal
  3. import re
  4. import sys
  5.  
  6. bracket_pattern = re.compile(r"(.+)\(([^\(\)]+)\)(.+)")
  7.  
  8. def decimalise(token):
  9.     try:
  10.         return Decimal(token)
  11.     except:
  12.         return token
  13.  
  14. def add_subtract(tokens):
  15.     assert "*" not in tokens and "/" not in tokens
  16.     while len(tokens) > 1:
  17.         operand_one, operator, operand_two, tail = (tokens[0], tokens[1],
  18.                                                     tokens[2], tokens[3:])
  19.         if operator == "+":
  20.             tokens = [operand_one + operand_two] + tail
  21.         elif operator == "-":
  22.             tokens = [operand_one - operand_two] + tail
  23.         else:
  24.             raise RuntimeError("oh no")
  25.     return tokens[0]
  26.  
  27. def multiply_divide(tokens):
  28.     while "*" in tokens or "/" in tokens:
  29.         for i in range(len(tokens)):
  30.             if tokens[i] == "*" or tokens[i] == "/":
  31.                 head, operand_one, operand_two, tail = (tokens[:max(i-1, 0)],
  32.                                                         tokens[i-1],
  33.                                                         tokens[i+1],
  34.                                                         tokens[i+2:])
  35.                 if tokens[i] == "*":
  36.                     tokens = head + [operand_one * operand_two] + tail
  37.                 elif tokens[i] == "/":
  38.                     tokens = head + [operand_one // operand_two] + tail
  39.                 else:
  40.                     raise RuntimeError("oh no 2")
  41.                 break
  42.     return tokens
  43.  
  44. def evaluate_str(string):
  45.     match = re.search(bracket_pattern, string)
  46.     while match is not None:
  47.         string = (match.group(1) + " "
  48.                   + str(evaluate_str(match.group(2)))
  49.                   + " " + match.group(3))
  50.         match = re.search(bracket_pattern, string)
  51.     tokens = list(map(decimalise, string.split(" ")))
  52.     tokens = [token for token in tokens if token != "" and token != " "]
  53.     tokens = multiply_divide(tokens)
  54.     return add_subtract(tokens)
  55.  
  56. try:
  57.     path = sys.argv[1]
  58. except IndexError:
  59.     path = "itsnewmath.txt"
  60.  
  61. with open(path) as f:
  62.     lines = f.readlines()
  63. for line in lines:
  64.     expr1, expr2 = line.strip().split(" = ")
  65.     try:
  66.         if evaluate_str(expr1) == evaluate_str(expr2):
  67.             answer = "True:   "
  68.         else:
  69.             answer = "False:  "
  70.     except:
  71.         answer = "Error:  "
  72.     print("{0}{1}".format(answer, line.strip()))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement