1
0
Files
Advent-of-Code/2020/src/main/kotlin/Day25.kt
T
2021-12-01 19:32:38 +01:00

45 lines
1.3 KiB
Kotlin

package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Lines
@Day(25)
class Day25(@Lines val input: IntArray) {
private val doorPublicKey = input[0]
private val cardPublicKey = input[1]
private fun encryptionKey(loopSize: Int, publicKey: Int) = transformSubjectNumber(loopSize, publicKey)
private fun transformSubjectNumber(loopSize: Int, subjectNumber: Int): Int {
var number = 1L
repeat(loopSize) {
number *= subjectNumber
number %= 20201227
}
return number.toInt()
}
private fun transformSubjectNumberStartingWith(currentNumber: Long, subjectNumber: Int): Long {
var number = currentNumber
number *= subjectNumber
number %= 20201227
return number
}
private fun findLoopSize(expectedPublicKey: Long): Int {
var computedPublicKey = 1L
var loopSize = 0
do {
computedPublicKey = transformSubjectNumberStartingWith(computedPublicKey, 7)
loopSize++
} while (computedPublicKey != expectedPublicKey)
return loopSize
}
fun part1(): Int {
val cardLoopSize = findLoopSize(cardPublicKey.toLong())
return encryptionKey(cardLoopSize, doorPublicKey)
}
}