Simplify D6P2 Kotlin further
This commit is contained in:
parent
9396c143d3
commit
687cba82dd
@ -1,12 +1,12 @@
|
|||||||
fun main() {
|
fun main() {
|
||||||
val input = generateSequence(::readLine).map { it.split(")") }.toList()
|
val input = generateSequence(::readLine).map { it.split(")") }.toList()
|
||||||
val parentToChildren = input.groupBy { it[0] }.mapValues { it.value.map { it[1] } }
|
val parentToChildren = input.groupBy { it[0] }.mapValues { it.value.map { it[1] } }
|
||||||
val childToParent = input.associateBy { it[1] }.mapValues { it.value[0] }
|
|
||||||
val rootNode = (parentToChildren.keys - parentToChildren.values.flatten().toSet()).first()
|
val rootNode = (parentToChildren.keys - parentToChildren.values.flatten().toSet()).first()
|
||||||
println("Part 1: ${countOrbiters(parentToChildren, rootNode, 0)}")
|
println("Part 1: ${countOrbiters(parentToChildren, rootNode, 0)}")
|
||||||
|
val childToParent = input.associateBy { it[1] }.mapValues { it.value[0] }
|
||||||
val santaParents = getParents(childToParent, "SAN")
|
val santaParents = getParents(childToParent, "SAN")
|
||||||
val myParents = getParents(childToParent, "YOU")
|
val myParents = getParents(childToParent, "YOU")
|
||||||
val commonParent = firstCommon(santaParents, myParents)
|
val commonParent = santaParents.first { it in myParents }
|
||||||
println("Part 2: ${santaParents.indexOf(commonParent) + myParents.indexOf(commonParent)}")
|
println("Part 2: ${santaParents.indexOf(commonParent) + myParents.indexOf(commonParent)}")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15,14 +15,3 @@ fun <T> countOrbiters(graph: Map<T, List<T>>, key: T, acc: Int): Int =
|
|||||||
|
|
||||||
fun <T> getParents(graph: Map<T, T>, key: T): List<T> =
|
fun <T> getParents(graph: Map<T, T>, key: T): List<T> =
|
||||||
graph[key]?.let { curr -> listOf(curr) + getParents(graph, curr) } ?: emptyList()
|
graph[key]?.let { curr -> listOf(curr) + getParents(graph, curr) } ?: emptyList()
|
||||||
|
|
||||||
fun <T> firstCommon(first: List<T>, second: List<T>): T {
|
|
||||||
val seen = mutableSetOf<T>()
|
|
||||||
for (i in 0..first.size) {
|
|
||||||
if (first[i] in seen) return first[i]
|
|
||||||
seen.add(first[i])
|
|
||||||
if (second[i] in seen) return second[i]
|
|
||||||
seen.add(second[i])
|
|
||||||
}
|
|
||||||
error("should be unreachable")
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user