diff --git a/day18.py b/day18.py index 2f97f7e..602c75b 100644 --- a/day18.py +++ b/day18.py @@ -115,8 +115,21 @@ class BinarySnailfish: return root def getLeftNumber(self) -> Union[None, 'BinarySnailfish']: + parent = self.parent + if self == self.parent.left: + while parent.parent and parent == parent.parent.left: + parent = parent.parent + parent = parent.left + else: + while parent.parent and parent == parent.parent.right: + parent = parent.parent + parent = parent.right + while parent.right.value is None: + parent = parent.right + return parent + leftnum = None - for current in self.getRoot().traverse_inorder(): + for current in self.getRoot().traverse_preorder(): if current == self: return leftnum if current.value is not None: @@ -124,7 +137,7 @@ class BinarySnailfish: def getRightNumber(self) -> Union[None, 'BinarySnailfish']: returnNext = 0 - for current in self.getRoot().traverse_inorder(): + for current in self.getRoot().traverse_preorder(): if returnNext >= 3 and current.value is not None: return current if returnNext > 0: @@ -150,36 +163,35 @@ class BinarySnailfish: self.value = 0 def reduce(self): - print(self.fours) if self.value is not None: return found = True while found: found = False - for n in self.fours: - self.fours.pop(0) - n.explode() - found = True - break + for n in self.traverse_preorder(): + if n.value is None and n.depth == 4: + n.explode() + found = True + break if found: continue - for n in self.traverse_inorder(): + for n in self.traverse_preorder(): if n.value is not None and n.value > 9: n.split() found = True break - def traverse_inorder(self): + def traverse_preorder(self): yield self if self.left: - for x in self.left.traverse_inorder(): + for x in self.left.traverse_preorder(): yield x if self.right: - for x in self.right.traverse_inorder(): + for x in self.right.traverse_preorder(): yield x def __add__(self, other):