Skip to content

Commit d5c3dc6

Browse files
committed
Brainfuck interpreter
1 parent bdd2de6 commit d5c3dc6

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

HackerRank/Misc/Brainfuck.scala

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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

Comments
 (0)