|
| 1 | +import java.math.BigInteger |
| 2 | + |
| 3 | +// https://adventofcode.com/2024/day/11 |
| 4 | + |
| 5 | +fun main() { |
| 6 | + |
| 7 | + |
| 8 | + data class Cache(private val cache: MutableMap<Pair<Long, Int>, BigInteger> = mutableMapOf()) { |
| 9 | + fun getCache(number: Long, deep: Int): BigInteger? = cache[number to deep] |
| 10 | + fun saveCache(number: Long, deep: Int, result: BigInteger) { |
| 11 | + cache[number to deep] = result |
| 12 | + } |
| 13 | + } |
| 14 | + |
| 15 | + fun dig(cache: Cache, maxLevel: Int, level: Int, number: Long): BigInteger { |
| 16 | + val cachedResult = cache.getCache(number, maxLevel - level) |
| 17 | + return when { |
| 18 | + level == maxLevel -> 1.toBigInteger() |
| 19 | + cachedResult != null -> cachedResult |
| 20 | + number == 0.toLong() -> dig(cache, maxLevel, level + 1, 1) |
| 21 | + number.toString().length % 2 == 1 -> dig(cache, maxLevel, level + 1, number * 2024) |
| 22 | + else -> { |
| 23 | + val (n1, n2) = number.toString() |
| 24 | + .let { |
| 25 | + it.substring(0, it.length / 2).toLong() to it.substring(it.length / 2).toLong() |
| 26 | + } |
| 27 | + dig(cache, maxLevel, level + 1, n1) + dig(cache, maxLevel, level + 1, n2) |
| 28 | + } |
| 29 | + }.apply { |
| 30 | + cache.saveCache(number, maxLevel - level, this) |
| 31 | + } |
| 32 | + } |
| 33 | + |
| 34 | + fun part1(input: List<String>): BigInteger { |
| 35 | + return input.first() |
| 36 | + .split(" ") |
| 37 | + .map { it.toLong() } |
| 38 | + .sumOf { dig(Cache(), 25, 0, it) } |
| 39 | + } |
| 40 | + |
| 41 | + fun part2(input: List<String>): BigInteger { |
| 42 | + return input.first() |
| 43 | + .split(" ") |
| 44 | + .map { it.toLong() } |
| 45 | + .sumOf { dig(Cache(), 75, 0, it) } |
| 46 | + } |
| 47 | + |
| 48 | + val testInput = readInput("Day11_test") |
| 49 | + val input = readInput("Day11") |
| 50 | + |
| 51 | + testBigInteger(55312.toBigInteger()) { part1(testInput) } |
| 52 | + execBigInteger { part1(input) } |
| 53 | + execBigInteger { part2(input) } |
| 54 | +} |
0 commit comments