aboutsummaryrefslogtreecommitdiff
path: root/2021-kotlin/src/Day12.kt
diff options
context:
space:
mode:
Diffstat (limited to '2021-kotlin/src/Day12.kt')
-rw-r--r--2021-kotlin/src/Day12.kt72
1 files changed, 0 insertions, 72 deletions
diff --git a/2021-kotlin/src/Day12.kt b/2021-kotlin/src/Day12.kt
deleted file mode 100644
index d3368da..0000000
--- a/2021-kotlin/src/Day12.kt
+++ /dev/null
@@ -1,72 +0,0 @@
-object Day12 {
- private class CaveGraph {
- companion object {
- fun fromLines(input: List<String>): CaveGraph =
- CaveGraph().apply { input.forEach { addConnection(it) } }
- }
-
- private val adjacencyList = mutableMapOf<Node, Set<Node>>()
-
- private fun addConnection(connectionString: String) {
- val (from, to) = connectionString.split("-").map(Node::fromString)
-
- adjacencyList.merge(from, setOf(to), Set<Node>::union)
- adjacencyList.merge(to, setOf(from), Set<Node>::union)
- }
-
- fun countPaths(canUseDoubleTraversal: Boolean = false): Int =
- traverse(Node.Start, setOf(), !canUseDoubleTraversal)
-
- private fun traverse(from: Node, visitedBefore: Set<Node>, usedUpDoubleTraverse: Boolean): Int {
- return adjacencyList[from]!!.sumOf {
- when (it) {
- is Node.Start -> 0
- is Node.End -> 1
- is Node.Big -> traverse(it, visitedBefore + from, usedUpDoubleTraverse)
- is Node.Small -> {
- if (!visitedBefore.contains(it)) {
- traverse(it, visitedBefore + from, usedUpDoubleTraverse)
- } else if (!usedUpDoubleTraverse) {
- traverse(it, visitedBefore + from, true)
- } else {
- 0
- }
- }
- }
- }
- }
-
- private sealed class Node {
- companion object {
- fun fromString(text: String): Node = when (text) {
- "start" -> Start
- "end" -> End
- else -> if (text == text.uppercase()) {
- Big(text)
- } else {
- Small(text)
- }
- }
- }
-
- object Start : Node()
- object End : Node()
- data class Small(private val identifier: String) : Node()
- data class Big(private val identifier: String) : Node()
- }
- }
-
- fun bothParts(input: List<String>) = CaveGraph.fromLines(input).let { it.countPaths() to it.countPaths(true) }
-}
-
-fun main() {
- val testInput = readInputAsLines("Day12_test")
- val testOutput = Day12.bothParts(testInput)
- check(testOutput.first == 226)
- check(testOutput.second == 3509)
-
- val input = readInputAsLines("Day12")
- val output = Day12.bothParts(input)
- println(output.first)
- println(output.second)
-}