Day 22.
This commit is contained in:
parent
f494b763cf
commit
0cb180ddf3
103
src/aoc2024/Day22.kt
Normal file
103
src/aoc2024/Day22.kt
Normal file
@ -0,0 +1,103 @@
|
||||
package aoc2024
|
||||
|
||||
import println
|
||||
import readInput
|
||||
|
||||
/*
|
||||
--- Day 22: Monkey Market ---
|
||||
https://adventofcode.com/2024/day/22
|
||||
*/
|
||||
fun main() {
|
||||
|
||||
val inlineTestInput = """
|
||||
1
|
||||
10
|
||||
100
|
||||
2024
|
||||
"""
|
||||
|
||||
val inlineTestInput2 = """
|
||||
1
|
||||
2
|
||||
3
|
||||
2024
|
||||
"""
|
||||
|
||||
fun next(number: Int): Int {
|
||||
val r1 = (number xor (number shl 6)) and 0xff_ff_ff
|
||||
val r2 = (r1 xor (r1 shr 5)) and 0xff_ff_ff
|
||||
val r3 = (r2 xor (r2 shl 11)) and 0xff_ff_ff
|
||||
return r3
|
||||
}
|
||||
|
||||
fun part1(input: List<String>): Long {
|
||||
var sum = 0L
|
||||
for (i in input.map(String::toInt)) {
|
||||
var v = i
|
||||
for (p in 1..2000) {
|
||||
v = next(v)
|
||||
}
|
||||
sum += v
|
||||
}
|
||||
return sum
|
||||
}
|
||||
|
||||
fun part2(input: List<String>): Int {
|
||||
val normalStrings = ArrayList<String>(2500)
|
||||
val deltaStrings = ArrayList<String>(2500)
|
||||
for (i in input.map(String::toInt)) {
|
||||
val normalString = StringBuffer(2024)
|
||||
val deltaString = StringBuffer(2024)
|
||||
var v = i
|
||||
var lastd = v % 10
|
||||
normalString.append(lastd)
|
||||
for (p in 1..2000) {
|
||||
v = next(v)
|
||||
val d = v % 10
|
||||
val delta = d - lastd
|
||||
normalString.append(d)
|
||||
deltaString.append('j' + delta)
|
||||
lastd = d
|
||||
}
|
||||
normalStrings.add(normalString.toString())
|
||||
deltaStrings.add(deltaString.toString())
|
||||
}
|
||||
|
||||
// it's not my fault that brute force is still working
|
||||
val tokenBuffer = StringBuffer(5)
|
||||
tokenBuffer.append(" ")
|
||||
val maxIdx = deltaStrings[0].length - 3
|
||||
var maxBananas = 0
|
||||
for (code in 0 until 19 * 19 * 19 * 19) {
|
||||
tokenBuffer.setCharAt(0, 'a' + (code / (19 * 19 * 19)))
|
||||
tokenBuffer.setCharAt(1, 'a' + ((code / (19 * 19)) % 19))
|
||||
tokenBuffer.setCharAt(2, 'a' + ((code / 19) % 19))
|
||||
tokenBuffer.setCharAt(3, 'a' + ((code % 19)))
|
||||
var bananas = 0
|
||||
val token = tokenBuffer.toString()
|
||||
for (i in deltaStrings.indices) {
|
||||
val idx = deltaStrings[i].indexOf(token)
|
||||
if (idx in 0..maxIdx) {
|
||||
bananas += normalStrings[i][idx + 4].digitToInt()
|
||||
}
|
||||
}
|
||||
maxBananas = maxBananas.coerceAtLeast(bananas)
|
||||
}
|
||||
return maxBananas
|
||||
}
|
||||
|
||||
// test if implementation meets criteria from the description, like:
|
||||
val testInput = inlineTestInput.trim().reader().readLines()
|
||||
val testInput2 = inlineTestInput2.trim().reader().readLines()
|
||||
//val testInput = readInput("aoc2024/Day22_test")
|
||||
val testInputPart1Result = part1(testInput)
|
||||
println("Part 1 Test: $testInputPart1Result")
|
||||
val testInputPart2Result = part2(testInput2)
|
||||
println("Part 2 Test: $testInputPart2Result")
|
||||
check(testInputPart1Result == 37327623L)
|
||||
check(testInputPart2Result == 23)
|
||||
|
||||
val input = readInput("aoc2024/Day22")
|
||||
part1(input).println()
|
||||
part2(input).println()
|
||||
}
|
Loading…
Reference in New Issue
Block a user