From d6fc9d7e5547a031803b3c9417cd59b6b52685ac Mon Sep 17 00:00:00 2001 From: daviddoji Date: Mon, 7 Mar 2022 21:42:46 +0100 Subject: [PATCH] [WIP] Solution to problem 6 part 1 in Python --- src/Year_2019/P6.py | 91 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/Year_2019/P6.py diff --git a/src/Year_2019/P6.py b/src/Year_2019/P6.py new file mode 100644 index 0000000..582be01 --- /dev/null +++ b/src/Year_2019/P6.py @@ -0,0 +1,91 @@ +# --- Day 6: Universal Orbit Map --- + +# You've landed at the Universal Orbit Map facility on Mercury. Because +# navigation in space often involves transferring between orbits, the orbit +# maps here are useful for finding efficient routes between, for example, you +# and Santa. You download a map of the local orbits (your puzzle input). + +# Except for the universal Center of Mass (COM), every object in space is in +# orbit around exactly one other object. An orbit looks roughly like this: + +# \ +# \ +# | +# | +# AAA--> o o <--BBB +# | +# | +# / +# / + +# In this diagram, the object BBB is in orbit around AAA. The path that BBB +# takes around AAA (drawn with lines) is only partly shown. In the map data, +# this orbital relationship is written AAA)BBB, which means "BBB is in orbit +# around AAA". + +# Before you use your map data to plot a course, you need to make sure it +# wasn't corrupted during the download. To verify maps, the Universal Orbit Map +# facility uses orbit count checksums - the total number of direct orbits (like +# the one shown above) and indirect orbits. + +# Whenever A orbits B and B orbits C, then A indirectly orbits C. This chain +# can be any number of objects long: if A orbits B, B orbits C, and C orbits D, +# then A indirectly orbits D. + +# For example, suppose you have the following map: + +# COM)B +# B)C +# C)D +# D)E +# E)F +# B)G +# G)H +# D)I +# E)J +# J)K +# K)L + +# Visually, the above map of orbits looks like this: + +# G - H J - K - L +# / / +# COM - B - C - D - E - F +# \ +# I + +# In this visual representation, when two objects are connected by a line, the +# one on the right directly orbits the one on the left. + +# Here, we can count the total number of orbits as follows: + +# D directly orbits C and indirectly orbits B and COM, a total of 3 orbits. +# L directly orbits K and indirectly orbits J, E, D, C, B, and COM, a total +# of 7 orbits. +# COM orbits nothing. + +# The total number of direct and indirect orbits in this example is 42. + +# What is the total number of direct and indirect orbits in your map data? + +with open("files/test") as f: + orbits = [line for line in f.read().strip().split()] + +# print(orbits) + +from collections import defaultdict + +planets = defaultdict(list) +for orbit in orbits: + planet, satellite = orbit.split(")") + planets[planet].append(satellite) + + +def count_orbits(node, counter, total_sum): + total_sum += counter + for satellite in planets[node]: + total_sum = count_orbits(satellite, counter + 1, total_sum) + return total_sum + + +print(count_orbits("COM", 0, 0))