Skip to content

Commit 0107955

Browse files
author
Krystian Kaniowski
committed
aoc-2024 - Day11
1 parent f56deaf commit 0107955

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

advent-of-code-2024/src/Day11.kt

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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

Comments
 (0)