mirror of
https://github.com/Crocmagnon/advent-of-code.git
synced 2024-11-24 15:38:10 +01:00
Implement day 6 part 2
This commit is contained in:
parent
6a69ee4255
commit
f633e19cea
2 changed files with 41 additions and 8 deletions
|
@ -1,5 +1,5 @@
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Dict
|
from typing import Dict, List
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -11,17 +11,38 @@ class Node:
|
||||||
return self.name.lower() == "com"
|
return self.name.lower() == "com"
|
||||||
|
|
||||||
def count_hops(self):
|
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
|
current = self
|
||||||
while not current.is_origin():
|
while not current.is_origin():
|
||||||
current = current.orbits_over
|
current = current.orbits_over
|
||||||
counter += 1
|
chain.append(current)
|
||||||
return counter
|
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():
|
def main():
|
||||||
with open("inputs/day06") as f:
|
with open("inputs/day06") as f:
|
||||||
orbits = f.read().split()
|
orbits = f.read().split()
|
||||||
|
|
||||||
objects = dict() # type: Dict[str, Node]
|
objects = dict() # type: Dict[str, Node]
|
||||||
for orbit in orbits:
|
for orbit in orbits:
|
||||||
stator, rotor = orbit.split(")")
|
stator, rotor = orbit.split(")")
|
||||||
|
@ -31,11 +52,10 @@ def main():
|
||||||
objects[stator.name] = stator
|
objects[stator.name] = stator
|
||||||
objects[rotor.name] = rotor
|
objects[rotor.name] = rotor
|
||||||
|
|
||||||
counter = 0
|
me = objects["YOU"]
|
||||||
for obj in objects.values():
|
santa = objects["SAN"]
|
||||||
counter += obj.count_hops()
|
|
||||||
|
|
||||||
print(counter)
|
print(me.count_hops() + santa.count_hops() - 2 * len(me.common_chain(santa)))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
13
2019/inputs/day06-ex2
Normal file
13
2019/inputs/day06-ex2
Normal file
|
@ -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
|
Loading…
Reference in a new issue