From f633e19cea33fb600f84aa40862288702b9ac25c Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Thu, 5 Mar 2020 21:48:44 +0100 Subject: [PATCH] Implement day 6 part 2 --- 2019/day06-orbits.py | 36 ++++++++++++++++++++++++++++-------- 2019/inputs/day06-ex2 | 13 +++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 2019/inputs/day06-ex2 diff --git a/2019/day06-orbits.py b/2019/day06-orbits.py index 15f818b..cbe0b27 100644 --- a/2019/day06-orbits.py +++ b/2019/day06-orbits.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Dict +from typing import Dict, List @dataclass @@ -11,17 +11,38 @@ class Node: return self.name.lower() == "com" def count_hops(self): - counter = 0 + return len(self.chain()) - 1 # Not counting self but it's part of the chain + + def chain(self): + chain = [self] current = self while not current.is_origin(): current = current.orbits_over - counter += 1 - return counter + chain.append(current) + return chain + + def common_chain(self, other: "Node") -> List["Node"]: + chain = [] + for el1, el2 in zip(reversed(self.chain()), reversed(other.chain())): + if el1 != el2: + break + chain.append(el1) + return chain + + def __str__(self) -> str: + if self.orbits_over: + return f"{self.orbits_over.name}){self.name}" + else: + return self.name + + def __eq__(self, other: "Node") -> bool: + return self.name == other.name def main(): with open("inputs/day06") as f: orbits = f.read().split() + objects = dict() # type: Dict[str, Node] for orbit in orbits: stator, rotor = orbit.split(")") @@ -31,11 +52,10 @@ def main(): objects[stator.name] = stator objects[rotor.name] = rotor - counter = 0 - for obj in objects.values(): - counter += obj.count_hops() + me = objects["YOU"] + santa = objects["SAN"] - print(counter) + print(me.count_hops() + santa.count_hops() - 2 * len(me.common_chain(santa))) if __name__ == "__main__": diff --git a/2019/inputs/day06-ex2 b/2019/inputs/day06-ex2 new file mode 100644 index 0000000..a1007c6 --- /dev/null +++ b/2019/inputs/day06-ex2 @@ -0,0 +1,13 @@ +COM)B +B)C +C)D +D)E +E)F +B)G +G)H +D)I +E)J +J)K +K)L +K)YOU +I)SAN