# https://www.codewars.com/kata/55f89832ac9a66518f000118/ import re from dataclasses import dataclass @dataclass class Term: coef: int variables: str def __repr__(self): return f"Term(coef={self.coef}, vars={self.variables})" def __str__(self): a = str(self.coef) if self.coef != 1 else "" a = "-" if a == "-1" else a b = "".join(self.variables) return f"{a}{b}" def __add__(self, other): print(f"add {self} {other}") if self.variables == other.variables: r = Term(self.coef+other.coef, self.variables) print(r) return r else: print(self.variables, other.variables) raise ArithmeticError("Variables do not match") def __lt__(self, other): return (len(self.variables) < len(other.variables)) and (self.variables < other.variables) def __eq__(self, other): return self.coef == other.coef and self.variables == other.variables def parse_term(inp: str) -> Term: sign, coef, variables = '', [], [] for n in inp: if n == '-': sign = '-' elif n.isnumeric(): coef.append(n) elif n.isalpha(): variables.append(n) c = -1 if sign == '-' else 1 c *= int("".join(coef)) if coef else 1 return Term(c, sorted(variables)) def simplify(poly): print(poly) # parse pattern = r"([+-]?\d*\w+)" terms = sorted(parse_term(t) for t in re.findall(pattern, poly)) print(terms) # simplify simplified_terms = [] for term in terms: if not simplified_terms: simplified_terms.append(term) continue previous = simplified_terms.pop() try: res = previous + term if res.coef != 0: simplified_terms.append(res) except ArithmeticError as e: print("no match") simplified_terms.append(previous) simplified_terms.append(term) # build output str res = "" for term in simplified_terms: s = str(term) if res and not s.startswith("-"): res += "+" res += s else: res += s return res