[WIP] Solution to problem 6 part 1 in Python
This commit is contained in:
parent
09cea8cf32
commit
d6fc9d7e55
91
src/Year_2019/P6.py
Normal file
91
src/Year_2019/P6.py
Normal file
@ -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))
|
Loading…
Reference in New Issue
Block a user