70 lines
2.3 KiB
Kotlin
70 lines
2.3 KiB
Kotlin
import java.io.File
|
|
|
|
fun getValue(map: MutableMap<String, Long>, value: String): Long {
|
|
return if(value.contains(Regex("\\d"))) value.toLong() else (map[value] ?: 0)
|
|
}
|
|
|
|
class Program(val lines: List<String>){
|
|
var numSent = 0
|
|
var index = 0
|
|
var queue = mutableListOf<Long>()
|
|
val registerMap = mutableMapOf<String, Long>()
|
|
var partner: Program? = null
|
|
var wait = false
|
|
fun step(){
|
|
if(index >= lines.size) return
|
|
val it = lines[index]
|
|
val split = it.split(" ")
|
|
if(it.startsWith("add")) {
|
|
registerMap[split[1]] = getValue(registerMap, split[1]) + getValue(registerMap, split[2])
|
|
} else if(it.startsWith("set")) {
|
|
registerMap[split[1]] = getValue(registerMap, split[2])
|
|
} else if(it.startsWith("snd")) {
|
|
partner!!.queue.add(getValue(registerMap, split[1]))
|
|
numSent++
|
|
} else if(it.startsWith("mul")) {
|
|
registerMap[split[1]] = getValue(registerMap, split[1]) * getValue(registerMap, split[2])
|
|
} else if(it.startsWith("mod")) {
|
|
registerMap[split[1]] = getValue(registerMap, split[1]) % getValue(registerMap, split[2])
|
|
} else if(it.startsWith("rcv")) {
|
|
if(queue.isEmpty()) {
|
|
wait = true
|
|
return
|
|
}
|
|
else {
|
|
registerMap[split[1]] = queue.removeAt(0)
|
|
wait = false
|
|
}
|
|
} else if(it.startsWith("jgz")) {
|
|
if(getValue(registerMap, split[1]) > 0) {
|
|
index += getValue(registerMap, split[2]).toInt()
|
|
return
|
|
}
|
|
}
|
|
index++
|
|
}
|
|
}
|
|
|
|
fun main(args: Array<String>) {
|
|
val file = File("../day18.txt")
|
|
// val file = File("test.txt")
|
|
val lines = file.readLines()
|
|
val firstLine = lines.first()
|
|
|
|
val registerMap = mutableMapOf<String, Long>()
|
|
var last = 0L
|
|
lines.forEach {
|
|
}
|
|
var index = 0;
|
|
val program1 = Program(lines)
|
|
val program2 = Program(lines)
|
|
program1.partner = program2
|
|
program2.partner = program1
|
|
program1.registerMap["p"] = 0
|
|
program2.registerMap["p"] = 1
|
|
while(!(program1.wait && program2.wait) && !(program1.index >= lines.size && program2.index >= lines.size)){
|
|
program1.step()
|
|
program2.step()
|
|
}
|
|
println(program2.numSent)
|
|
} |