fork download
  1. __AUTHOR__ = "Cuesta0113"
  2.  
  3. class Letter:
  4. def __init__(self, s:str):
  5. self.name = s[0]
  6. self.isPrime = s[-1] == "'"
  7. self.value = ord(s[0]) * 10 + (1 if self.isPrime else 0)
  8.  
  9. def __lt__(self, other: "Letter"):
  10. return self.value < other.value
  11.  
  12. def __str__(self):
  13. return self.name + ("'" if self.isPrime else "")
  14.  
  15. class Term:
  16. def __init__(self, letters: list[Letter]):
  17. self.letters = letters
  18.  
  19. def __lt__(self, other: "Term"):
  20. length = min(len(self.letters), len(other.letters))
  21. for i in range(length):
  22. if self.letters[i] > other.letters[i]: return True
  23. if self.letters[i] < other.letters[i]: return False
  24. return len(self.letters) > len(other.letters)
  25.  
  26. def __str__(self):
  27. return "".join([str(letter) for letter in self.letters])
  28.  
  29. class Validator:
  30. def autoSort(self, expression: str) -> list[list[Letter]]:
  31. # exclude the space
  32. expression = expression.replace(" ", "").replace(" ", "")
  33.  
  34. # fix the typing error
  35. expression = expression.replace("+", "+")\
  36. .replace("'", "'")\
  37. .replace("`", "'")\
  38. .replace("’", "'")\
  39. .replace("‘", "'")\
  40. .replace("‵", "'")\
  41. .replace("(", "")\
  42. .replace(")", "")\
  43. .replace("(", "")\
  44. .replace(")", "")\
  45.  
  46. # split SOP format by '+'
  47. tmp = expression.split("+")
  48. terms: list[list[Letter]] = []
  49. for term in tmp:
  50. terms.append([])
  51. # find next letter
  52. for i, ch in enumerate(term):
  53. if ch.isalpha():
  54. terms[-1].append(Letter(term[i:i+2]))
  55.  
  56. # sort each term internally
  57. for term in terms:
  58. term.sort()
  59.  
  60. # wrap each term with class
  61. terms = [Term(term) for term in terms]
  62.  
  63. # sort each term externally, a solid bubble sort
  64. for i in range(len(terms)):
  65. for j in range(len(terms)):
  66. if terms[i] > terms[j]: terms[i], terms[j] = terms[j], terms[i]
  67.  
  68. return terms
  69.  
  70. def isRT(a: str, b:str, term:str):
  71. pass
  72.  
  73.  
  74.  
  75. if __name__ == "__main__":
  76. v = Validator()
  77. result = []
  78. for term in v.autoSort(input("Please Enter The Expression In SOP Format: ")):
  79. result.append(str(term))
  80. print("+".join(result))
  81.  
  82. """
  83. TEST CASES:
  84.  
  85. A‵BD' + A B D’ + BCD + ABC‘ + AB'D
  86. => ABC'+ABD'+AB'D+A'BD'+BCD
  87.  
  88. A’BD` + DBC + ABC‵ + AB‘D+A'A
  89. => AA'+ABC'+AB'D+A'BD'+BCD
  90.  
  91. BB'B+BA+A'A+A
  92. => A+AA'+AB+BBB'
  93. """
Success #stdin #stdout 0.05s 9996KB
stdin
A'BC'
stdout
Please Enter The Expression In SOP Format: A'BC'