|
| 1 | +object Solution { |
| 2 | + def execute(program: String, input: Iterator[Char]): Unit = { |
| 3 | + val mem = Array.ofDim[Int](1 << 16) |
| 4 | + var dataPtr, instPtr = 0 |
| 5 | + var iterations = 100000 |
| 6 | + val twinBracket = Array.ofDim[Int](program.size) |
| 7 | + val s = scala.collection.mutable.Stack[Int]() |
| 8 | + for (i <- program.indices) { |
| 9 | + if (program(i) == '[') s.push(i) |
| 10 | + if (program(i) == ']') { |
| 11 | + twinBracket(i) = s.top |
| 12 | + twinBracket(s.pop) = i |
| 13 | + } |
| 14 | + } |
| 15 | + while (iterations > 0 && instPtr < program.size) { |
| 16 | + program(instPtr) match { |
| 17 | + case '+' => mem(dataPtr) = (mem(dataPtr) + 1) % 256 |
| 18 | + case '-' => mem(dataPtr) = (mem(dataPtr) - 1 + 256) % 256 |
| 19 | + case '.' => print(mem(dataPtr).toChar) |
| 20 | + case ',' => mem(dataPtr) = input.next().toByte |
| 21 | + case '<' => dataPtr -= 1 |
| 22 | + case '>' => dataPtr += 1 |
| 23 | + case '[' => if (mem(dataPtr) == 0) instPtr = twinBracket(instPtr) - 1 |
| 24 | + case ']' => if (mem(dataPtr) != 0) instPtr = twinBracket(instPtr) - 1 |
| 25 | + } |
| 26 | + instPtr += 1 |
| 27 | + iterations -= 1 |
| 28 | + } |
| 29 | + if (instPtr < program.size) |
| 30 | + println("\nPROCESS TIME OUT. KILLED!!!") |
| 31 | + } |
| 32 | + |
| 33 | + def main(args: Array[String]): Unit = { |
| 34 | + val programLineCount = (readLine split " ")(1).toInt |
| 35 | + val input = readLine |
| 36 | + val program = Seq.fill(programLineCount)(readLine).mkString.filter ("<>+-.,[]" contains _) |
| 37 | + execute(program, input.toIterator) |
| 38 | + } |
| 39 | +} |
0 commit comments