from enum import Enum
class Operation(Enum):
AND = 0
OR = 1
XOR = 2
VALUE = 3
class Node:
def __init__(
self,
operation,
value,
left = None,
right = None,
):
self.operation = operation
self.value = value
self.left = left
self.right = right
def eval_tree(node):
if node is None:
raise Exception("root is None")
if node.operation == Operation.VALUE:
return
eval_tree(node.left)
eval_tree(node.right)
if node.operation == Operation.AND:
node.value = node.left.value and node.right.value
elif node.operation == Operation.OR:
node.value = node.left.value or node.right.value
elif node.operation == Operation.XOR:
node.value = node.left.value ^ node.right.value
def eval_flips(node, root_if_true, root_if_false):
if node is None:
raise Exception("node is None")
if node.operation == Operation.VALUE:
print(root_if_false if node.value else root_if_true)
return
if node.operation == Operation.AND:
# If rhs is false, lhs doesn't affect the result.
eval_flips(node.left, root_if_true if node.right.value else root_if_false, root_if_false)
# If lhs is false, rhs doesn't affect the result.
eval_flips(node.right, root_if_true if node.left.value else root_if_false, root_if_false)
elif node.operation == Operation.OR:
eval_flips(node.left, root_if_true, root_if_true if node.right.value else root_if_false)
eval_flips(node.right, root_if_true, root_if_true if node.left.value else root_if_false)
elif node.operation == Operation.XOR:
# متروك للطالب
pass
def example1() -> Node:
return Node(
operation=Operation.AND,
value=None,
left=Node(
operation=Operation.OR,
value=None,
left=Node(operation=Operation.VALUE, value=True),
right=Node(
operation=Operation.AND,
value=None,
left=Node(operation=Operation.VALUE, value=True),
right=Node(operation=Operation.VALUE, value=False),
),
),
right=Node(
operation=Operation.OR,
value=None,
left=Node(operation=Operation.VALUE, value=True),
right=Node(operation=Operation.VALUE, value=False),
),
)
def main():
root = example1()
eval_tree(root)
eval_flips(root, True, False)
if __name__ == "__main__":
main()
ZnJvbSBlbnVtIGltcG9ydCBFbnVtCgoKY2xhc3MgT3BlcmF0aW9uKEVudW0pOgogICAgQU5EID0gMAogICAgT1IgPSAxCiAgICBYT1IgPSAyCiAgICBWQUxVRSA9IDMKCgpjbGFzcyBOb2RlOgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgb3BlcmF0aW9uLAogICAgICAgIHZhbHVlLAogICAgICAgIGxlZnQgPSBOb25lLAogICAgICAgIHJpZ2h0ID0gTm9uZSwKICAgICk6CiAgICAgICAgc2VsZi5vcGVyYXRpb24gPSBvcGVyYXRpb24KICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0CiAgICAgICAgc2VsZi5yaWdodCA9IHJpZ2h0CgpkZWYgZXZhbF90cmVlKG5vZGUpOgogICAgaWYgbm9kZSBpcyBOb25lOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigicm9vdCBpcyBOb25lIikKICAgIGlmIG5vZGUub3BlcmF0aW9uID09IE9wZXJhdGlvbi5WQUxVRToKICAgICAgICByZXR1cm4KCiAgICBldmFsX3RyZWUobm9kZS5sZWZ0KQogICAgZXZhbF90cmVlKG5vZGUucmlnaHQpCgogICAgaWYgbm9kZS5vcGVyYXRpb24gPT0gT3BlcmF0aW9uLkFORDoKICAgICAgICBub2RlLnZhbHVlID0gbm9kZS5sZWZ0LnZhbHVlIGFuZCBub2RlLnJpZ2h0LnZhbHVlCiAgICBlbGlmIG5vZGUub3BlcmF0aW9uID09IE9wZXJhdGlvbi5PUjoKICAgICAgICBub2RlLnZhbHVlID0gbm9kZS5sZWZ0LnZhbHVlIG9yIG5vZGUucmlnaHQudmFsdWUKICAgIGVsaWYgbm9kZS5vcGVyYXRpb24gPT0gT3BlcmF0aW9uLlhPUjoKICAgICAgICBub2RlLnZhbHVlID0gbm9kZS5sZWZ0LnZhbHVlIF4gbm9kZS5yaWdodC52YWx1ZQoKZGVmIGV2YWxfZmxpcHMobm9kZSwgcm9vdF9pZl90cnVlLCByb290X2lmX2ZhbHNlKToKICAgIGlmIG5vZGUgaXMgTm9uZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oIm5vZGUgaXMgTm9uZSIpCiAgICBpZiBub2RlLm9wZXJhdGlvbiA9PSBPcGVyYXRpb24uVkFMVUU6CiAgICAgICAgcHJpbnQocm9vdF9pZl9mYWxzZSBpZiBub2RlLnZhbHVlIGVsc2Ugcm9vdF9pZl90cnVlKQogICAgICAgIHJldHVybgoKICAgIGlmIG5vZGUub3BlcmF0aW9uID09IE9wZXJhdGlvbi5BTkQ6CiAgICAgICAgIyBJZiByaHMgaXMgZmFsc2UsIGxocyBkb2Vzbid0IGFmZmVjdCB0aGUgcmVzdWx0LgogICAgICAgIGV2YWxfZmxpcHMobm9kZS5sZWZ0LCByb290X2lmX3RydWUgaWYgbm9kZS5yaWdodC52YWx1ZSBlbHNlIHJvb3RfaWZfZmFsc2UsIHJvb3RfaWZfZmFsc2UpCiAgICAgICAgIyBJZiBsaHMgaXMgZmFsc2UsIHJocyBkb2Vzbid0IGFmZmVjdCB0aGUgcmVzdWx0LgogICAgICAgIGV2YWxfZmxpcHMobm9kZS5yaWdodCwgcm9vdF9pZl90cnVlIGlmIG5vZGUubGVmdC52YWx1ZSBlbHNlIHJvb3RfaWZfZmFsc2UsIHJvb3RfaWZfZmFsc2UpCiAgICBlbGlmIG5vZGUub3BlcmF0aW9uID09IE9wZXJhdGlvbi5PUjoKICAgICAgICBldmFsX2ZsaXBzKG5vZGUubGVmdCwgcm9vdF9pZl90cnVlLCByb290X2lmX3RydWUgaWYgbm9kZS5yaWdodC52YWx1ZSBlbHNlIHJvb3RfaWZfZmFsc2UpCiAgICAgICAgZXZhbF9mbGlwcyhub2RlLnJpZ2h0LCByb290X2lmX3RydWUsIHJvb3RfaWZfdHJ1ZSBpZiBub2RlLmxlZnQudmFsdWUgZWxzZSByb290X2lmX2ZhbHNlKQogICAgZWxpZiBub2RlLm9wZXJhdGlvbiA9PSBPcGVyYXRpb24uWE9SOgogICAgICAgICMg2YXYqtix2YjZgyDZhNmE2LfYp9mE2KgKICAgICAgICBwYXNzCgpkZWYgZXhhbXBsZTEoKSAtPiBOb2RlOgogICAgcmV0dXJuIE5vZGUoCiAgICAgICAgb3BlcmF0aW9uPU9wZXJhdGlvbi5BTkQsCiAgICAgICAgdmFsdWU9Tm9uZSwKICAgICAgICBsZWZ0PU5vZGUoCiAgICAgICAgICAgIG9wZXJhdGlvbj1PcGVyYXRpb24uT1IsCiAgICAgICAgICAgIHZhbHVlPU5vbmUsCiAgICAgICAgICAgIGxlZnQ9Tm9kZShvcGVyYXRpb249T3BlcmF0aW9uLlZBTFVFLCB2YWx1ZT1UcnVlKSwKICAgICAgICAgICAgcmlnaHQ9Tm9kZSgKICAgICAgICAgICAgICAgIG9wZXJhdGlvbj1PcGVyYXRpb24uQU5ELAogICAgICAgICAgICAgICAgdmFsdWU9Tm9uZSwKICAgICAgICAgICAgICAgIGxlZnQ9Tm9kZShvcGVyYXRpb249T3BlcmF0aW9uLlZBTFVFLCB2YWx1ZT1UcnVlKSwKICAgICAgICAgICAgICAgIHJpZ2h0PU5vZGUob3BlcmF0aW9uPU9wZXJhdGlvbi5WQUxVRSwgdmFsdWU9RmFsc2UpLAogICAgICAgICAgICApLAogICAgICAgICksCiAgICAgICAgcmlnaHQ9Tm9kZSgKICAgICAgICAgICAgb3BlcmF0aW9uPU9wZXJhdGlvbi5PUiwKICAgICAgICAgICAgdmFsdWU9Tm9uZSwKICAgICAgICAgICAgbGVmdD1Ob2RlKG9wZXJhdGlvbj1PcGVyYXRpb24uVkFMVUUsIHZhbHVlPVRydWUpLAogICAgICAgICAgICByaWdodD1Ob2RlKG9wZXJhdGlvbj1PcGVyYXRpb24uVkFMVUUsIHZhbHVlPUZhbHNlKSwKICAgICAgICApLAogICAgKQoKCmRlZiBtYWluKCk6CiAgICByb290ID0gZXhhbXBsZTEoKQogICAgZXZhbF90cmVlKHJvb3QpCiAgICBldmFsX2ZsaXBzKHJvb3QsIFRydWUsIEZhbHNlKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCk=