Day 25: Snowverload
Megathread guidelines
- 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
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- 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
Python (Not C…)
(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]))
https://github.com/sjmulder/aoc/tree/master/2023/python/day25.py