import java.io.File fun getValue(map: MutableMap, value: String): Long { return if(value.contains(Regex("\\d"))) value.toLong() else (map[value] ?: 0) } class Program(val lines: List){ var numSent = 0 var index = 0 var queue = mutableListOf() val registerMap = mutableMapOf() 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) { val file = File("../day18.txt") // val file = File("test.txt") val lines = file.readLines() val firstLine = lines.first() val registerMap = mutableMapOf() 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) }