EliasJR

Untitled

May 19th, 2023 (edited)
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. tinf = """root: pppw + sjmn
  2. dbpl: 5
  3. cczh: sllz + lgvd
  4. zczc: 2
  5. ptdq: humn - dvpt
  6. dvpt: 3
  7. lfqf: 4
  8. humn: 5
  9. ljgn: 2
  10. sjmn: drzm * dbpl
  11. sllz: 4
  12. pppw: cczh / lfqf
  13. lgvd: ljgn * ptdq
  14. drzm: hmdt - zczc
  15. hmdt: 32"""
  16.  
  17. lines = inf.split("\n")
  18.  
  19. class Node:
  20. def __init__(self, name, left, right, op, val):
  21. self.name = name
  22. self.left = left
  23. self.right = right
  24. self.op = op
  25. self.val = val
  26. self.unknown = False
  27.  
  28. def __str__(self):
  29. print(f"{self.name} = {self.left.name if self.left else 'None'} {self.op} {self.right.name if self.right else 'None'}, {self.val}")
  30. if self.left: print(self.left)
  31. if self.right: print(self.right)
  32. return ""
  33.  
  34.  
  35. def build_tree(monkeys, name):
  36. if monkeys[name].isdigit():
  37. return Node(name, None, None, None, int(monkeys[name]))
  38. elif monkeys[name] == 'x':
  39. return Node(name, None, None, None, None)
  40. else:
  41. e = monkeys[name].split(" ")
  42. return Node(name, build_tree(monkeys, e[0]), build_tree(monkeys, e[2]), e[1], None)
  43.  
  44. def complete_tree(node):
  45. if node.name == "humn":
  46. node.unknown = True
  47. return "x"
  48. if node.val != None:
  49. return node.val
  50. else:
  51. left_res = complete_tree(node.left)
  52. right_res = complete_tree(node.right)
  53. if left_res == "x":
  54. node.unknown = True
  55. node.val = right_res
  56. return "x"
  57. elif right_res == "x":
  58. node.unknown = True
  59. node.val = left_res
  60. return "x"
  61. else:
  62. match node.op:
  63. case '+':
  64. node.val = left_res + right_res
  65. case '-':
  66. node.val = left_res - right_res
  67. case '*':
  68. node.val = left_res * right_res
  69. case '/':
  70. node.val = left_res / right_res
  71. return node.val
  72.  
  73. def print_tree(node, level=0):
  74. if node is not None:
  75. print_tree(node.right, level=level+1)
  76. print(" " * level + str(node.val))
  77. print_tree(node.left, level=level+1)
  78.  
  79. def solve2():
  80. monkeys = {}
  81. for line in lines:
  82. line = line.split(": ")
  83. monkeys[line[0]] = line[1]
  84.  
  85. monkeys['root'] = monkeys['root'].split(" + ")[0] + " = " + monkeys['root'].split(" + ")[1]
  86. monkeys['humn'] = 'x'
  87.  
  88. left = build_tree(monkeys, monkeys['root'].split(" = ")[0])
  89. right = build_tree(monkeys, monkeys['root'].split(" = ")[1])
  90.  
  91. complete_tree(left)
  92. complete_tree(right)
  93.  
  94. if left.unknown:
  95. val_to_solve = int(right.val)
  96. q = [left]
  97. else:
  98. val_to_solve = int(left.val)
  99. q = [right]
  100.  
  101. d = {
  102. "+": "-",
  103. "-": "+",
  104. "*": "/",
  105. "/": "*"
  106. }
  107.  
  108. while q:
  109. cur = q.pop(0)
  110. match cur.op:
  111. case '+':
  112. val_to_solve -= cur.val
  113. case '-':
  114. val_to_solve += cur.val
  115. case '*':
  116. val_to_solve /= cur.val
  117. case '/':
  118. val_to_solve *= cur.val
  119. if not cur.left and not cur.right: break
  120. if cur.left.unknown:
  121. q.append(cur.left)
  122. elif cur.right.unknown:
  123. q.append(cur.right)
  124.  
  125. print('done', val_to_solve)
  126.  
  127.  
  128.  
  129.  
  130. # solve1()
  131. solve2()
Advertisement
Add Comment
Please, Sign In to add comment