aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-12-24 17:56:50 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-12-24 17:56:50 +0100
commit14175103cc4e90b92a051bd37b2168365b7574db (patch)
tree2c6f0f85c4808d6902c247f1453d267a0f44ef95
parent3774cc95387d2d334de0dd192e611b548f0989aa (diff)
Add 2024 day 23 solutions
-rw-r--r--2024/23/.gitignore1
-rw-r--r--2024/23/Makefile1
-rw-r--r--2024/23/puzzles.py55
3 files changed, 57 insertions, 0 deletions
diff --git a/2024/23/.gitignore b/2024/23/.gitignore
new file mode 100644
index 0000000..8931d44
--- /dev/null
+++ b/2024/23/.gitignore
@@ -0,0 +1 @@
+puzzle-[12].py \ No newline at end of file
diff --git a/2024/23/Makefile b/2024/23/Makefile
new file mode 100644
index 0000000..6e58a9d
--- /dev/null
+++ b/2024/23/Makefile
@@ -0,0 +1 @@
+include ../../Makefiles/py.mk \ No newline at end of file
diff --git a/2024/23/puzzles.py b/2024/23/puzzles.py
new file mode 100644
index 0000000..93fdc0f
--- /dev/null
+++ b/2024/23/puzzles.py
@@ -0,0 +1,55 @@
+#!/usr/bin/python3
+
+import collections
+import itertools
+
+
+def main() -> None:
+ g = collections.defaultdict(set)
+ with open("input", "r") as f:
+ for line in f.readlines():
+ l, r = line.rstrip().split("-")
+ g[l].add(r)
+ g[r].add(l)
+
+ # START PART 1
+ cliques: set[tuple[str, str, str]] = set()
+ # END PART 1 START PART 2
+ minsz = 1
+ clique: list[str] = []
+ # END PART 2
+
+ for x, s in g.items():
+ # START PART 2
+ for i in range(minsz + 1, len(s) + 1):
+ # END PART 2 START PART 1
+ i = 3
+ # END PART 1
+ nodes = tuple(s) + (x,)
+ for comb in itertools.combinations(nodes, i):
+ if cliquep(g, comb):
+ # START PART 1
+ if any(x[0] == 't' for x in comb):
+ cliques.add(tuple(sorted(comb)))
+ # END PART 1 START PART 2
+ minsz = i
+ clique = sorted(comb)
+ # END PART 2
+
+ # START PART 1
+ print(len(cliques))
+ # END PART 1 START PART 2
+ print(','.join(clique))
+ # END PART 2
+
+
+def cliquep(g: dict[str, set[str]], nodes: tuple[str, ...]) -> bool:
+ for i, x in enumerate(nodes):
+ for y in nodes[i + 1:]:
+ if x not in g[y]:
+ return False
+ return True
+
+
+if __name__ == "__main__":
+ main() \ No newline at end of file