-
Notifications
You must be signed in to change notification settings - Fork 0
/
Day25FullOfHotAir.kt
46 lines (37 loc) · 1.41 KB
/
Day25FullOfHotAir.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package adventofcode.year2022
import adventofcode.Puzzle
import adventofcode.PuzzleInput
import kotlin.math.pow
class Day25FullOfHotAir(customInput: PuzzleInput? = null) : Puzzle(customInput) {
override val name = "Full of Hot Air"
override fun partOne() = input
.lines()
.sumOf { it.fromSnafuNumber() }
.toSnafuNumber()
companion object {
private const val SNAFU_NUMBER_BASE = 5
private fun String.fromSnafuNumber() = this
.reversed()
.mapIndexed { index, digit ->
when (digit) {
'=' -> -2
'-' -> -1
else -> digit.digitToInt()
} * SNAFU_NUMBER_BASE.toDouble().pow(index).toLong()
}
.sum()
private tailrec fun Long.toSnafuNumber(snafuNumber: String = ""): String =
when {
this == 0L && snafuNumber == "" -> "0"
this == 0L -> snafuNumber
else -> {
val quotient = this / SNAFU_NUMBER_BASE
when (val remainder = this % SNAFU_NUMBER_BASE) {
4L -> (quotient + 1).toSnafuNumber("-$snafuNumber")
3L -> (quotient + 1).toSnafuNumber("=$snafuNumber")
else -> quotient.toSnafuNumber("$remainder$snafuNumber")
}
}
}
}
}