From 2190f9e1ac81fec68b9179b6a341cf5cdf13eedb Mon Sep 17 00:00:00 2001 From: chrisly42 Date: Thu, 11 Dec 2025 07:55:54 +0100 Subject: [PATCH] No need to have two different recursion functions for Day 11. Tidied up. --- src/aoc2025/Day11.kt | 49 ++++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/src/aoc2025/Day11.kt b/src/aoc2025/Day11.kt index 7b5db4e..bec5e34 100644 --- a/src/aoc2025/Day11.kt +++ b/src/aoc2025/Day11.kt @@ -38,16 +38,6 @@ ggg: out hhh: out """ - data class Node(val name: String, val children: Set) - - fun rec(children: HashMap>, p: String, visited: MutableSet): Int { - if (p == "out") return 1 - visited.add(p) - val res = children[p]!!.sumOf { rec(children, it, visited) } - visited.remove(p) - return res - } - fun parseInput(input: List): HashMap> { val children = HashMap>() for (i in input) { @@ -58,13 +48,7 @@ hhh: out return children } - fun part1(input: List): Int { - val children = parseInput(input) - - return rec(children, "you", HashSet()) - } - - fun rec2( + fun rec( children: HashMap>, p: String, stop: String, @@ -72,24 +56,27 @@ hhh: out memo: HashMap = HashMap() ): Long { if (p == stop) return 1L - val memoVal = memo[p] - if (memoVal != null) return memoVal - visited.add(p) - val res = children[p]?.sumOf { rec2(children, it, stop, visited, memo) } ?: 0L - visited.remove(p) - memo[p] = res - return res + return memo.getOrPut(p) { + visited.add(p) + val res = children[p]?.sumOf { rec(children, it, stop, visited, memo) } ?: 0L + visited.remove(p) + res + } + } + + fun part1(input: List): Long { + return rec(parseInput(input), "you", "out") } fun part2(input: List): Long { val children = parseInput(input) - val srvToDac = rec2(children, "svr", "dac") - val dacToFft = rec2(children, "dac", "fft") - val fftToOut = rec2(children, "fft", "out") - val srvToFft = rec2(children, "svr", "fft") - val fftToDac = rec2(children, "fft", "dac") - val dacToOut = rec2(children, "dac", "out") + val srvToDac = rec(children, "svr", "dac") + val dacToFft = rec(children, "dac", "fft") + val fftToOut = rec(children, "fft", "out") + val srvToFft = rec(children, "svr", "fft") + val fftToDac = rec(children, "fft", "dac") + val dacToOut = rec(children, "dac", "out") return srvToDac * dacToFft * fftToOut + srvToFft * fftToDac * dacToOut } @@ -102,7 +89,7 @@ hhh: out println("Part 1 Test: $testInputPart1Result") val testInputPart2Result = part2(testInput2) println("Part 2 Test: $testInputPart2Result") - check(testInputPart1Result == 5) + check(testInputPart1Result == 5L) check(testInputPart2Result == 2L) val input = readInput("aoc2025/Day11")