diff --git a/src/Year_2017/P7.py b/src/Year_2017/P7.py new file mode 100644 index 0000000..7a1c5b5 --- /dev/null +++ b/src/Year_2017/P7.py @@ -0,0 +1,92 @@ +# --- Day 7: Recursive Circus --- + +# Wandering further through the circuits of the computer, you come upon a tower +# of programs that have gotten themselves into a bit of trouble. A recursive +# algorithm has gotten out of hand, and now they're balanced precariously in a +# large tower. + +# One program at the bottom supports the entire tower. It's holding a large +# disc, and on the disc are balanced several more sub-towers. At the bottom of +# these sub-towers, standing on the bottom disc, are other programs, each +# holding their own disc, and so on. At the very tops of these +# sub-sub-sub-...-towers, many programs stand simply keeping the disc below +# them balanced but with no disc of their own. + +# You offer to help, but first you need to understand the structure of these +# towers. You ask each program to yell out their name, their weight, and (if +# they're holding a disc) the names of the programs immediately above them +# balancing on that disc. You write this information down (your puzzle input). +# Unfortunately, in their panic, they don't do this in an orderly fashion; by +# the time you're done, you're not sure which program gave which information. + +# For example, if your list is the following: + +# pbga (66) +# xhth (57) +# ebii (61) +# havc (66) +# ktlj (57) +# fwft (72) -> ktlj, cntj, xhth +# qoyq (66) +# padx (45) -> pbga, havc, qoyq +# tknk (41) -> ugml, padx, fwft +# jptl (61) +# ugml (68) -> gyxo, ebii, jptl +# gyxo (61) +# cntj (57) + +# ...then you would be able to recreate the structure of the towers that looks +# like this: + +# gyxo +# / +# ugml - ebii +# / \ +# | jptl +# | +# | pbga +# / / +# tknk --- padx - havc +# \ \ +# | qoyq +# | +# | ktlj +# \ / +# fwft - cntj +# \ +# xhth + +# In this example, tknk is at the bottom of the tower (the bottom program), +# and is holding up ugml, padx, and fwft. Those programs are, in turn, holding +# up other programs; in this example, none of those programs are holding up any +# other programs, and are all the tops of their own towers. (The actual tower +# balancing in front of you is much larger.) + +# Before you're ready to help them, you need to make sure your information is +# correct. What is the name of the bottom program? + +with open("files/P7.txt") as f: + towers = [line for line in f.read().strip().split("\n")] + + +def part_1(): + parents, childs = [], [] + for line in towers: + if "->" in line: + lhs, rhs = line.split(" -> ") + parent, _ = lhs.split() + parents.append(parent) + _childs = rhs.split(", ") + for child in _childs: + childs.append(child) + else: + parent, _ = line.split() + parents.append(parent) + + root_program = list(set(parents) - set(childs))[0] + + print(f"The name of the bottom program is {root_program}") + + +if __name__ == "__main__": + part_1()