Coverage Summary for Class: Day25p1Kt (day25p1)
Class |
Method, %
|
Line, %
|
Day25p1Kt |
100%
(1/1)
|
100%
(12/12)
|
Day25p1Kt$solve$edges$1 |
100%
(1/1)
|
100%
(1/1)
|
Day25p1Kt$solve$edges$2 |
100%
(1/1)
|
100%
(1/1)
|
Day25p1Kt$solve$edges$3 |
100%
(1/1)
|
100%
(1/1)
|
Day25p1Kt$solve$edges$3$1 |
100%
(1/1)
|
100%
(1/1)
|
Day25p1Kt$solve$edges$4 |
100%
(1/1)
|
100%
(1/1)
|
Day25p1Kt$solve$edges$5 |
100%
(1/1)
|
100%
(1/1)
|
Day25p1Kt$solve$nodes$1 |
100%
(1/1)
|
100%
(1/1)
|
Total |
100%
(8/8)
|
100%
(19/19)
|
package day25p1
import org.jgrapht.alg.clustering.GirvanNewmanClustering
import org.jgrapht.graph.SimpleGraph
fun solve(diagramInput: String): Long {
val edges = diagramInput.lineSequence()
.map { it.split(": ") }
.map { (left, rights) -> left to rights.split(' ') }
.flatMap { (left, rights) -> rights.asSequence().map { if (left < it) left to it else it to left } }
.sortedWith(compareBy({ it.first }, { it.second }))
.toSet()
val nodes = edges.asSequence().flatMap { sequenceOf(it.first, it.second) }.distinct().sorted().toList()
val graph = SimpleGraph.createBuilder<String, Edge>(Edge::class.java).let { builder ->
nodes.forEach { builder.addVertex(it) }
edges.forEach { builder.addEdge(it.first, it.second, Edge(it.first, it.second)) }
builder.build()
}
return GirvanNewmanClustering(graph, 2).clustering.clusters.fold(1L) { acc, cluster -> acc * cluster.size }
}
data class Edge(val from: String, val to: String)