diff --git a/2017/12/12.md b/2017/12/12.md new file mode 100644 index 0000000..6e1d754 --- /dev/null +++ b/2017/12/12.md @@ -0,0 +1,80 @@ +## \-\-- 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`? + +Your puzzle answer was `113`. + +## \-\-- Part Two \-\-- {#part2} + +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? + +Your puzzle answer was `202`. + +Both parts of this puzzle are complete! They provide two gold stars: +\*\* + +At this point, you should [return to your Advent calendar](/2017) and +try another puzzle. + +If you still want to see it, you can [get your puzzle +input](12/input). diff --git a/2017/12/solution.py b/2017/12/solution.py new file mode 100644 index 0000000..2aa43e9 --- /dev/null +++ b/2017/12/solution.py @@ -0,0 +1,101 @@ +#!/bin/python3 +import sys,re +from pprint import pprint +sys.path.insert(0, '../../') +from fred import list2int + +input_f = 'input' + +part = 2 +######################################### +# # +# Part 1 # +# # +######################################### + +def visit(next,visited,records): + #print('Starting at',next, ' having visited',visited) + #print(records[next]) + if len(records[next]) == 1: + if records[next][0] not in visited: + visited.append(records[next][0]) + next = records[next][0] + visit(next,visited,records) + else: + for i in records[next]: + if i not in visited: + visited.append(i) + visit(i,visited,records) + return visited + +if part == 1: + + records = {} + visited = [] + + with open(input_f) as file: + for line in file: + l = line.rstrip().replace(' ','') + if '<->' in l: + x = l.split('<->') + records[int(x[0])] = list2int(x[1].split(',')) + + #pprint(records) + start_node = 0 + + visited = visit(start_node,visited,records) + + + print(visited) + print(len(visited)) + + +######################################### +# # +# Part 2 # +# # +######################################### +def visit(next,visited,records): + #print('Starting at',next, ' having visited',visited) + #print(records[next]) + if len(records[next]) == 1: + if records[next][0] not in visited: + visited.append(records[next][0]) + next = records[next][0] + visit(next,visited,records) + else: + for i in records[next]: + if i not in visited: + visited.append(i) + visit(i,visited,records) + return visited + +if part == 2: + + records = {} + visited = [] + + with open(input_f) as file: + for line in file: + l = line.rstrip().replace(' ','') + if '<->' in l: + x = l.split('<->') + records[int(x[0])] = list2int(x[1].split(',')) + + #pprint(records) + start_node = 0 + + groups = [] + + for i in range(0,len(records)): + if not any(i in sublist for sublist in groups): + #print(i, ' not in ', groups) + visited = visit(i,visited,records) + groups.append(visited) + #print('Visited',visited) + visited = [] + #print(len(visited)) + + pprint(groups) + print(len(groups)) + diff --git a/__pycache__/fred.cpython-311.pyc b/__pycache__/fred.cpython-311.pyc new file mode 100644 index 0000000..3fb6e16 Binary files /dev/null and b/__pycache__/fred.cpython-311.pyc differ diff --git a/fred.py b/fred.py new file mode 100644 index 0000000..1ca6baa --- /dev/null +++ b/fred.py @@ -0,0 +1,2 @@ +def list2int(x): + return list(map(int, x)) diff --git a/solution.py b/solution.py index 3814efb..beabd72 100644 --- a/solution.py +++ b/solution.py @@ -11,9 +11,9 @@ part = 1 # # ######################################### -if part == 1 -with open(input_f) as file: - for line in file: +if part == 1: + with open(input_f) as file: + for line in file: