AdventOfCode-2017/day18.kt

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)
}