diff --git a/src/main/kotlin/Day22.kt b/src/main/kotlin/Day22.kt new file mode 100644 index 0000000..e71eeb6 --- /dev/null +++ b/src/main/kotlin/Day22.kt @@ -0,0 +1,54 @@ +import utils.AoCDay +import utils.cartesianSquare +import utils.mapToLong + +class Day22 : AoCDay() { + val numbers = input.mapToLong() + override fun part1(): Any { + return numbers.sumOf { + var result = it + repeat(2000) { + result = calculateNumber(result) + } + result + } + } + + override fun part2(): Any { + val priceChanges = numbers.map { + val prices = mutableListOf(it % 10) + var result = it + repeat(2000) { + result = calculateNumber(result) + prices += result % 10 + } + + prices.windowed(2).map { (a, b) -> b - a to b }.windowed(4).map { l -> + l.map { it.first } to l.last().second + }.reversed().associate { it } + } + val allSequences = (-9L..9L).cartesianSquare().cartesianSquare().map { (a, b) -> + listOf(a.first, a.second, b.first, b.second) + } + return allSequences.maxOf { sequence -> priceChanges.sumOf { cost -> cost[sequence] ?: 0 } } + } + + fun calculateNumber(secretNumber: Long): Long { + var result = secretNumber + result = prune(mix(result * 64, result)) + result = prune(mix(result / 32, result)) + return prune(mix(result * 2048, result)) + } + + fun mix(value: Long, secretNumber: Long): Long { + return value xor secretNumber + } + + fun prune(secretNumber: Long): Long { + return secretNumber % 16777216L + } +} + +fun main() { + Day22().execute() +} \ No newline at end of file diff --git a/src/main/kotlin/utils/Extensions.kt b/src/main/kotlin/utils/Extensions.kt index 0511a1a..34c35ad 100644 --- a/src/main/kotlin/utils/Extensions.kt +++ b/src/main/kotlin/utils/Extensions.kt @@ -109,3 +109,4 @@ fun List.chunkedInput(): List> { return this.joinToString("\n").split("\n\n").map { it.split("\n") } } +fun Iterable.cartesianSquare(): List> = flatMap { v -> map { v to it } }