Spaces:
Running
Running
file = "input.txt" | |
def parse_input(file): | |
connections = {} | |
with open(file, 'r') as f: | |
for line in f: | |
a, b = line.strip().split('-') | |
if a not in connections: | |
connections[a] = set() | |
if b not in connections: | |
connections[b] = set() | |
connections[a].add(b) | |
connections[b].add(a) | |
return connections | |
def find_triangles(connections): | |
triangles = set() | |
for a in connections: | |
for b in connections[a]: | |
if b > a: # Ensure unique pairs | |
for c in connections[b]: | |
if c > b and c in connections[a]: | |
triangles.add(tuple(sorted([a, b, c]))) | |
return triangles | |
def filter_triangles(triangles): | |
return [triangle for triangle in triangles if any(comp.startswith('t') for comp in triangle)] | |
def find_largest_clique(connections): | |
def is_clique(potential_clique): | |
return all(connections[a].issuperset(potential_clique - {a}) for a in potential_clique) | |
def expand_clique(current_clique, candidates): | |
max_clique = current_clique | |
for candidate in candidates: | |
new_clique = current_clique | {candidate} | |
new_candidates = candidates & connections[candidate] | |
if is_clique(new_clique): | |
expanded_clique = expand_clique(new_clique, new_candidates) | |
if len(expanded_clique) > len(max_clique): | |
max_clique = expanded_clique | |
return max_clique | |
all_computers = set(connections.keys()) | |
largest_clique = set() | |
for computer in all_computers: | |
clique = expand_clique({computer}, connections[computer]) | |
if len(clique) > len(largest_clique): | |
largest_clique = clique | |
return largest_clique | |
connections = parse_input(file) | |
triangles = find_triangles(connections) | |
filtered_triangles = filter_triangles(triangles) | |
print(len(filtered_triangles)) | |
largest_clique = find_largest_clique(connections) | |
password = ','.join(sorted(largest_clique)) | |
print(password) |