-
Notifications
You must be signed in to change notification settings - Fork 0
/
15b.kt
58 lines (57 loc) · 1.68 KB
/
15b.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
import kotlin.io.path.Path
import kotlin.io.path.readLines
import kotlin.math.*
fun main() {
val fileName = "15.in"
val input = Path(fileName).readLines()
val commands = input[0]
var result = 0
var boxes = mutableMapOf<Int, MutableList<Pair<String, Int>>>()
var operations = mutableListOf<Triple<Char, String, Int>>()
for (command in commands.split(",")) {
val minusRegex = """(\w+)-""".toRegex()
val minusResult = minusRegex.find(command)
if (minusResult != null) {
val (label) = minusResult.destructured
operations += Triple('-', label, 0)
}
val equalRegex = """(\w+)=(\w+)""".toRegex()
val equalResult = equalRegex.find(command)
if (equalResult != null) {
val (label, no) = equalResult.destructured
operations += Triple('=', label, no.toInt())
}
}
for ((op, label, no) in operations) {
var hash = 0
for (char in label) {
hash += char.code
hash *= 17
hash %= 256
}
if (op == '=') {
var found = false
for ((ix, ele) in boxes[hash]?.withIndex() ?: emptyList()) {
if (ele.first == label) {
found = true
boxes[hash]!![ix] = Pair(label, no)
}
}
if (!found) boxes.getOrPut(hash) { mutableListOf() } += Pair(label, no)
} else {
var toRemove = mutableListOf<Int>()
for ((ix, ele) in boxes[hash]?.withIndex() ?: emptyList()) {
if (ele.first == label) {
toRemove += ix
}
}
for (ix in toRemove.reversed()) boxes[hash]!!.removeAt(ix)
}
}
for (i in 0 until 256) {
for ((ix, ele) in boxes[i]?.withIndex() ?: emptyList()) {
result += (i + 1) * (ix + 1) * ele.second
}
}
println(result)
}