-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay16.kt
122 lines (101 loc) · 2.93 KB
/
Day16.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package aoc2021.day16
import aoc2020.day05.binaryToDecimal
fun expandAndSumVersion(hexInput: String): Int {
val hexToBin = getHexToBinMap()
val packetsToProcess = mutableListOf<Packet>()
var binaryInput = ""
hexInput.forEach { binaryInput += hexToBin[it] }
var versionChecksum = -1
packetsToProcess.add(
Packet(
binaryInput.substring(6),
binaryToDecimal(binaryInput.substring(0, 3).toInt()),
binaryToDecimal(binaryInput.substring(3, 6).toInt())
)
)
while (packetsToProcess.isNotEmpty()) {
val packet = packetsToProcess[0]
// when (packet.typeId) {
// 4 -> {
// val bits = packet.content.windowed(5, 5)
// var number = ""
// bits.forEach { number += it.substring(1) }
// val result = binaryToDecimal(number.toInt())
// }
// else -> {
// val lengthTypeId = packet.content.substring(0, 1).toInt()
// val length = if (lengthTypeId == 0) 15 else 11
// }
// }
versionChecksum += (packet.version)
packetsToProcess.removeAt(0)
}
return versionChecksum
}
fun processPacket(binaryInput: String): Int {
val packet = Packet(
binaryInput.substring(6),
binaryToDecimal(binaryInput.substring(0, 3).toInt()),
binaryToDecimal(binaryInput.substring(3, 6).toInt())
)
var versionChecksum = 0
when (packet.typeId) {
4 -> {
val bits = packet.content.windowed(5, 5)
val bitsToKeep = mutableListOf<String>()
for (idx in 1..bits.size) {
bitsToKeep.add(bits[idx])
if (bits[idx].startsWith("0")) {
break
}
}
var number = ""
bits.forEach { number += it.substring(1) }
val result = binaryToDecimal(number.toInt())
versionChecksum += packet.version
}
else -> {
val lengthTypeId = packet.content.substring(6, 7).toInt()
if (lengthTypeId == 0) {
val totalLengthBits = 15
val totalLength = binaryToDecimal(packet.content.substring(7, 7 + totalLengthBits).toInt())
} else {
val subPacketsNumBits = 11
val subPacketsNum = binaryToDecimal(packet.content.substring(7, 7 + subPacketsNumBits).toInt())
}
}
}
return versionChecksum
}
fun processLiteralPacket(literalPacket: String): Int {
return -1
}
fun processOperatorPackets(operatorPackets: String): Int {
val versionChecksum = 0
return versionChecksum
}
fun getHexToBinMap(): Map<Char, String> {
val map = mutableMapOf<Char, String>()
map['0'] = "0000"
map['1'] = "0001"
map['2'] = "0010"
map['3'] = "0011"
map['4'] = "0100"
map['5'] = "0101"
map['6'] = "0110"
map['7'] = "0111"
map['8'] = "1000"
map['9'] = "1001"
map['A'] = "1010"
map['B'] = "1011"
map['C'] = "1100"
map['D'] = "1101"
map['E'] = "1110"
map['F'] = "1111"
return map
}
class Packet(val content: String, val version: Int, val typeId: Int) {
override fun toString(): String {
return "{version: $version, typeId: $typeId, packet: $content}"
}
}