@@ -16,6 +16,44 @@ object Day23 {
16
16
17
17
def count3CliquesT (edges : Set [Edge ]): Int = find3Cliques(edges).count(_.exists(_.startsWith(" t" )))
18
18
19
+ // copied from 2018 day 23
20
+ // TODO: move to library
21
+ def maximumClique (neighbors : Map [Computer , Set [Computer ]]): Set [Computer ] = {
22
+ var best : Set [Computer ] = Set .empty
23
+
24
+ def bronKerbosh (r : Set [Computer ], p : Set [Computer ], x : Set [Computer ]): Unit = {
25
+ if (p.isEmpty && x.isEmpty) {
26
+ // println(r)
27
+ if (r.size > best.size)
28
+ best = r
29
+ }
30
+ else {
31
+ // val u = p.headOption.getOrElse(x.head)
32
+ val u = (p ++ x).maxBy(neighbors(_).size) // pivot on highest degree
33
+ var p2 = p
34
+ var x2 = x
35
+ for (v <- p -- neighbors(u)) {
36
+ bronKerbosh(r + v, p2 intersect neighbors(v), x2 intersect neighbors(v))
37
+ p2 -= v
38
+ x2 += v
39
+ }
40
+ }
41
+ }
42
+
43
+ bronKerbosh(Set .empty, neighbors.keySet, Set .empty)
44
+ best
45
+ }
46
+
47
+ def maximumClique (edges : Set [Edge ]): Set [Computer ] = {
48
+ val neighbors = (edges ++ edges.map(_.swap)).groupMap(_._1)(_._2)
49
+ maximumClique(neighbors)
50
+ }
51
+
52
+ def lanPartyPassword (edges : Set [Edge ]): String = {
53
+ val clique = maximumClique(edges)
54
+ clique.toSeq.sorted.mkString(" ," )
55
+ }
56
+
19
57
def parseEdge (s : String ): Edge = s match {
20
58
case s " $from- $to" => (from, to)
21
59
}
@@ -26,6 +64,7 @@ object Day23 {
26
64
27
65
def main (args : Array [String ]): Unit = {
28
66
println(count3CliquesT(parseEdges(input)))
67
+ println(lanPartyPassword(parseEdges(input)))
29
68
30
69
// part 1: 2366 - too high (used contains 't' instead of startsWith 't')
31
70
}
0 commit comments