39 lines
1.2 KiB
Julia
39 lines
1.2 KiB
Julia
using DataStructures
|
|
|
|
function execute(src)
|
|
pointers = Dict{Int,Int}()
|
|
stack = Int[]
|
|
for (ptr, opcode) in enumerate(src)
|
|
if opcode == '[' push!(stack, ptr) end
|
|
if opcode == ']'
|
|
if isempty(stack)
|
|
src = src[1:ptr]
|
|
break
|
|
end
|
|
sptr = pop!(stack)
|
|
pointers[ptr], pointers[sptr] = sptr, ptr
|
|
end
|
|
end
|
|
if ! isempty(stack) error("unclosed loops at $stack") end
|
|
tape = DefaultDict{Int,Int}(0)
|
|
cell, ptr = 0, 1
|
|
while ptr ≤ length(src)
|
|
opcode = src[ptr]
|
|
if opcode == '>' cell += 1
|
|
elseif opcode == '<' cell -= 1
|
|
elseif opcode == '+' tape[cell] += 1
|
|
elseif opcode == '-' tape[cell] -= 1
|
|
elseif opcode == ',' tape[cell] = Int(read(STDIN, 1))
|
|
elseif opcode == '.' print(STDOUT, Char(tape[cell]))
|
|
elseif (opcode == '[' && tape[cell] == 0) ||
|
|
(opcode == ']' && tape[cell] != 0) ptr = pointers[ptr]
|
|
end
|
|
ptr += 1
|
|
end
|
|
end
|
|
|
|
const src = """\
|
|
>++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>
|
|
>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++."""
|
|
execute(src)
|