def load_data(file): with open(file) as f: data = f.readlines() nodes = [] for line in data: line = line.strip("\n") (n1, n2) = line.split("-") nodes.append((n1, n2)) return nodes def get_connections(computer, all_nodes): connections = set() nodes = [node for node in all_nodes if computer in node] for node in nodes: # n1, n2 = node for c in list(node): if c != computer: connections.add(c) return list(connections) # file = "test.txt" file = "input.txt" nodes = load_data(file) # Build connections all_nodes = [] all_computers = set() for node in nodes: c1, c2 = node all_nodes.append(set(set((c1, c2)))) all_computers.add(c1) all_computers.add(c2) # We are pretty much brute forcing here # Given a computer, find all its connections # For each pair of connections, check if they are connected all_three_nodes = set() for c1 in all_computers: connections = get_connections(c1, all_nodes) for i in range(len(connections)): for j in range(i+1, len(connections)): c2 = connections[i] c3 = connections[j] if set((c2, c3)) in all_nodes: # Checks if they are connected trinode = [c1, c2, c3] trinode = tuple(sorted(trinode)) all_three_nodes.add(trinode) candidate_nodes = [] for node in all_three_nodes: for c in node: if c[0] == "t": candidate_nodes.append(node) break print(len(candidate_nodes)) ## Part 2 file = "input.txt" # file = "test.txt" nodes = load_data(file) # Build connections all_nodes = [] all_computers = set() for node in nodes: c1, c2 = node all_nodes.append(set(set((c1, c2)))) all_computers.add(c1) all_computers.add(c2) # This will be useful! # https://en.wikipedia.org/wiki/Clique_problem#Finding_a_single_maximal_clique # Basically a greedy algorithm def get_clique(computer): clique = set() clique.add(computer) connections = get_connections(computer, all_nodes) for connection in connections: if connection == computer: # lazy way of skipping itself continue is_valid = True for c in clique: if not set((c, connection)) in all_nodes: is_valid = False break if is_valid: clique.add(connection) return clique max_clique = set() for computer in all_computers: clique = get_clique(computer) if len(clique) > len(max_clique): max_clique = clique print(",".join(sorted(list(max_clique))))