advent24-llm / day23 /solution_gpt-4o.py
jerpint's picture
Add solution files
a4da721
raw
history blame
2.08 kB
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)