Solution to problem 12 in Python
This commit is contained in:
parent
c25363a677
commit
a749e9f9bc
105
src/Year_2017/P12.py
Normal file
105
src/Year_2017/P12.py
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
# --- Day 12: Digital Plumber ---
|
||||||
|
|
||||||
|
# Walking along the memory banks of the stream, you find a small village that
|
||||||
|
# is experiencing a little confusion: some programs can't communicate with each
|
||||||
|
# other.
|
||||||
|
|
||||||
|
# Programs in this village communicate using a fixed system of pipes. Messages
|
||||||
|
# are passed between programs using these pipes, but most programs aren't
|
||||||
|
# connected to each other directly. Instead, programs pass messages between
|
||||||
|
# each other until the message reaches the intended recipient.
|
||||||
|
|
||||||
|
# For some reason, though, some of these messages aren't ever reaching their
|
||||||
|
# intended recipient, and the programs suspect that some pipes are missing.
|
||||||
|
# They would like you to investigate.
|
||||||
|
|
||||||
|
# You walk through the village and record the ID of each program and the IDs
|
||||||
|
# with which it can communicate directly (your puzzle input). Each program has
|
||||||
|
# one or more programs with which it can communicate, and these pipes are
|
||||||
|
# bidirectional; if 8 says it can communicate with 11, then 11 will say it can
|
||||||
|
# communicate with 8.
|
||||||
|
|
||||||
|
# You need to figure out how many programs are in the group that contains
|
||||||
|
# program ID 0.
|
||||||
|
|
||||||
|
# For example, suppose you go door-to-door like a travelling salesman and
|
||||||
|
# record the following list:
|
||||||
|
|
||||||
|
# 0 <-> 2
|
||||||
|
# 1 <-> 1
|
||||||
|
# 2 <-> 0, 3, 4
|
||||||
|
# 3 <-> 2, 4
|
||||||
|
# 4 <-> 2, 3, 6
|
||||||
|
# 5 <-> 6
|
||||||
|
# 6 <-> 4, 5
|
||||||
|
|
||||||
|
# In this example, the following programs are in the group that contains
|
||||||
|
# program ID 0:
|
||||||
|
|
||||||
|
# Program 0 by definition.
|
||||||
|
# Program 2, directly connected to program 0.
|
||||||
|
# Program 3 via program 2.
|
||||||
|
# Program 4 via program 2.
|
||||||
|
# Program 5 via programs 6, then 4, then 2.
|
||||||
|
# Program 6 via programs 4, then 2.
|
||||||
|
|
||||||
|
# Therefore, a total of 6 programs are in this group; all but program 1, which
|
||||||
|
# has a pipe that connects it to itself.
|
||||||
|
|
||||||
|
# How many programs are in the group that contains program ID 0?
|
||||||
|
|
||||||
|
import networkx as nx
|
||||||
|
|
||||||
|
with open("files/P12.txt") as f:
|
||||||
|
pipes = [line for line in f.read().strip().split("\n")]
|
||||||
|
|
||||||
|
|
||||||
|
village = nx.Graph()
|
||||||
|
|
||||||
|
|
||||||
|
def part_1() -> None:
|
||||||
|
for pipe in pipes:
|
||||||
|
_from, neighbors = pipe.split(" <-> ")
|
||||||
|
|
||||||
|
village.add_edges_from(
|
||||||
|
(_from, neighbor) for neighbor in neighbors.split(", ")
|
||||||
|
)
|
||||||
|
|
||||||
|
res = len(nx.node_connected_component(village, "0"))
|
||||||
|
|
||||||
|
print(f'There are {res} programs containing "ID 0"')
|
||||||
|
|
||||||
|
|
||||||
|
# --- Part Two ---
|
||||||
|
|
||||||
|
# There are more programs than just the ones in the group containing program
|
||||||
|
# ID 0. The rest of them have no way of reaching that group, and still might
|
||||||
|
# have no way of reaching each other.
|
||||||
|
|
||||||
|
# A group is a collection of programs that can all communicate via pipes either
|
||||||
|
# directly or indirectly. The programs you identified just a moment ago are all
|
||||||
|
# part of the same group. Now, they would like you to determine the total
|
||||||
|
# number of groups.
|
||||||
|
|
||||||
|
# In the example above, there were 2 groups: one consisting of programs
|
||||||
|
# 0,2,3,4,5,6, and the other consisting solely of program 1.
|
||||||
|
|
||||||
|
# How many groups are there in total?
|
||||||
|
|
||||||
|
|
||||||
|
def part_2() -> None:
|
||||||
|
for pipe in pipes:
|
||||||
|
_from, neighbors = pipe.split(" <-> ")
|
||||||
|
|
||||||
|
village.add_edges_from(
|
||||||
|
(_from, neighbor) for neighbor in neighbors.split(", ")
|
||||||
|
)
|
||||||
|
|
||||||
|
res = nx.number_connected_components(village)
|
||||||
|
|
||||||
|
print(f"There are {res} groups in total")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
part_1()
|
||||||
|
part_2()
|
Loading…
Reference in New Issue
Block a user