Coverage Summary for Class: Edge (day25p1)

Class Class, % Method, % Line, %
Edge 100% (1/1) 100% (1/1) 100% (1/1)


 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)