Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
(Posting from an alt because SDF is having issues)
A graph problem 😬. There are well-known algorithms but none trivial to implement in C.
I tried dividing the nodes into two groups and then moving the node with the worst in-group/out-group edge balance - a Wish version of the Kernighan-Lin algorithm. As expected, it got stuck in a local optimum for the real input and random prodding didn't help.
Programming is programming and libraries are fair game so I went to Python and used NetworkX which was my first time using the library but so easy to use! Maybe I'll go back and do it in C someday and implement the algorithm myself.
#!/usr/bin/env python3
import sys
import re
from networkx import Graph
from networkx.algorithms.community import greedy_modularity_communities
G = Graph()
for line in sys.stdin.readlines():
words = re.findall("\\w+", line)
for to in words[1:]:
G.add_edge(words[0], to)
coms = greedy_modularity_communities(G, best_n=2)
print("25:", len(coms[0]) * len(coms[1]))
import networkx as nx
from .solver import Solver
class Day25(Solver):
def __init__(self):
super().__init__(25)
def presolve(self, input: str):
self.graph = nx.Graph()
for line in input.splitlines():
from_, to_line = line.split(': ')
for to in to_line.split(' '):
self.graph.add_edge(from_, to)
def solve_first_star(self) -> int | str:
cut_value, partition = nx.algorithms.stoer_wagner(self.graph)
return len(partition[0]) * len(partition[1])