Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- from decimal import Decimal
- import re
- import sys
- bracket_pattern = re.compile(r"(.+)\(([^\(\)]+)\)(.+)")
- def decimalise(token):
- try:
- return Decimal(token)
- except:
- return token
- def add_subtract(tokens):
- assert "*" not in tokens and "/" not in tokens
- while len(tokens) > 1:
- operand_one, operator, operand_two, tail = (tokens[0], tokens[1],
- tokens[2], tokens[3:])
- if operator == "+":
- tokens = [operand_one + operand_two] + tail
- elif operator == "-":
- tokens = [operand_one - operand_two] + tail
- else:
- raise RuntimeError("oh no")
- return tokens[0]
- def multiply_divide(tokens):
- while "*" in tokens or "/" in tokens:
- for i in range(len(tokens)):
- if tokens[i] == "*" or tokens[i] == "/":
- head, operand_one, operand_two, tail = (tokens[:max(i-1, 0)],
- tokens[i-1],
- tokens[i+1],
- tokens[i+2:])
- if tokens[i] == "*":
- tokens = head + [operand_one * operand_two] + tail
- elif tokens[i] == "/":
- tokens = head + [operand_one // operand_two] + tail
- else:
- raise RuntimeError("oh no 2")
- break
- return tokens
- def evaluate_str(string):
- match = re.search(bracket_pattern, string)
- while match is not None:
- string = (match.group(1) + " "
- + str(evaluate_str(match.group(2)))
- + " " + match.group(3))
- match = re.search(bracket_pattern, string)
- tokens = list(map(decimalise, string.split(" ")))
- tokens = [token for token in tokens if token != "" and token != " "]
- tokens = multiply_divide(tokens)
- return add_subtract(tokens)
- try:
- path = sys.argv[1]
- except IndexError:
- path = "itsnewmath.txt"
- with open(path) as f:
- lines = f.readlines()
- for line in lines:
- expr1, expr2 = line.strip().split(" = ")
- try:
- if evaluate_str(expr1) == evaluate_str(expr2):
- answer = "True: "
- else:
- answer = "False: "
- except:
- answer = "Error: "
- print("{0}{1}".format(answer, line.strip()))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement