Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- tinf = """root: pppw + sjmn
- dbpl: 5
- cczh: sllz + lgvd
- zczc: 2
- ptdq: humn - dvpt
- dvpt: 3
- lfqf: 4
- humn: 5
- ljgn: 2
- sjmn: drzm * dbpl
- sllz: 4
- pppw: cczh / lfqf
- lgvd: ljgn * ptdq
- drzm: hmdt - zczc
- hmdt: 32"""
- lines = inf.split("\n")
- class Node:
- def __init__(self, name, left, right, op, val):
- self.name = name
- self.left = left
- self.right = right
- self.op = op
- self.val = val
- self.unknown = False
- def __str__(self):
- print(f"{self.name} = {self.left.name if self.left else 'None'} {self.op} {self.right.name if self.right else 'None'}, {self.val}")
- if self.left: print(self.left)
- if self.right: print(self.right)
- return ""
- def build_tree(monkeys, name):
- if monkeys[name].isdigit():
- return Node(name, None, None, None, int(monkeys[name]))
- elif monkeys[name] == 'x':
- return Node(name, None, None, None, None)
- else:
- e = monkeys[name].split(" ")
- return Node(name, build_tree(monkeys, e[0]), build_tree(monkeys, e[2]), e[1], None)
- def complete_tree(node):
- if node.name == "humn":
- node.unknown = True
- return "x"
- if node.val != None:
- return node.val
- else:
- left_res = complete_tree(node.left)
- right_res = complete_tree(node.right)
- if left_res == "x":
- node.unknown = True
- node.val = right_res
- return "x"
- elif right_res == "x":
- node.unknown = True
- node.val = left_res
- return "x"
- else:
- match node.op:
- case '+':
- node.val = left_res + right_res
- case '-':
- node.val = left_res - right_res
- case '*':
- node.val = left_res * right_res
- case '/':
- node.val = left_res / right_res
- return node.val
- def print_tree(node, level=0):
- if node is not None:
- print_tree(node.right, level=level+1)
- print(" " * level + str(node.val))
- print_tree(node.left, level=level+1)
- def solve2():
- monkeys = {}
- for line in lines:
- line = line.split(": ")
- monkeys[line[0]] = line[1]
- monkeys['root'] = monkeys['root'].split(" + ")[0] + " = " + monkeys['root'].split(" + ")[1]
- monkeys['humn'] = 'x'
- left = build_tree(monkeys, monkeys['root'].split(" = ")[0])
- right = build_tree(monkeys, monkeys['root'].split(" = ")[1])
- complete_tree(left)
- complete_tree(right)
- if left.unknown:
- val_to_solve = int(right.val)
- q = [left]
- else:
- val_to_solve = int(left.val)
- q = [right]
- d = {
- "+": "-",
- "-": "+",
- "*": "/",
- "/": "*"
- }
- while q:
- cur = q.pop(0)
- match cur.op:
- case '+':
- val_to_solve -= cur.val
- case '-':
- val_to_solve += cur.val
- case '*':
- val_to_solve /= cur.val
- case '/':
- val_to_solve *= cur.val
- if not cur.left and not cur.right: break
- if cur.left.unknown:
- q.append(cur.left)
- elif cur.right.unknown:
- q.append(cur.right)
- print('done', val_to_solve)
- # solve1()
- solve2()
Advertisement
Add Comment
Please, Sign In to add comment