Skip to content

Commit 84868f9

Browse files
committed
Day 12, 2017 - Parts I & II
1 parent f6a6dc0 commit 84868f9

File tree

3 files changed

+2086
-0
lines changed

3 files changed

+2086
-0
lines changed

2017/day12.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import os
2+
import re
3+
4+
class Village:
5+
6+
def __init__(self, lines):
7+
self.programs = {}
8+
self.parse_lines(lines)
9+
self.groups = []
10+
self.all_group_items = []
11+
12+
def parse_lines(self, lines):
13+
for line in lines:
14+
self.parse_line(line)
15+
16+
def parse_line(self, line):
17+
line = re.sub(',', '', line)
18+
chars = line.split(' ')
19+
chars.pop(1)
20+
ids = [int(i) for i in chars if i != ',']
21+
root = ids.pop(0)
22+
self.add_program(root)
23+
root = self.programs[root]
24+
for id in ids:
25+
self.add_program(id)
26+
self.programs[id].add_linked_program(root)
27+
28+
def add_program(self, id):
29+
if id not in self.programs.keys():
30+
self.programs[id] = Program(id)
31+
32+
def collect_all_groups(self):
33+
for program in list(self.programs.values()):
34+
self.collect(program)
35+
return self.groups
36+
37+
def collect(self, program):
38+
if program.id not in self.all_group_items:
39+
group = program.collect()
40+
self.groups.append(group)
41+
self.all_group_items += group
42+
43+
44+
class Program:
45+
46+
def __init__(self, id):
47+
self.id = id
48+
self.linked = {}
49+
50+
def __repr__(self):
51+
return str(self)
52+
53+
def __str__(self):
54+
return 'P' + str(self.id)
55+
56+
def add_linked_program(self, program):
57+
if program.id not in self.linked.keys():
58+
self.linked[program.id] = program
59+
program.add_linked_program(self)
60+
61+
def collect(self, group=[]):
62+
if self.id not in group:
63+
group.append(self.id)
64+
for linked in list(self.linked.values()):
65+
if linked.id not in group:
66+
linked.collect(group)
67+
return group
68+
69+
70+
71+
72+
if __name__ == '__main__':
73+
rel_path = os.path.dirname(os.path.abspath(__file__))
74+
file_path = os.path.join(rel_path, "inputs/day12.txt")
75+
f = open(file_path)
76+
data = f.read().split('\n')
77+
v = Village(data)
78+
print(len(v.programs[0].collect()))
79+
print(len(v.collect_all_groups()))

0 commit comments

Comments
 (0)