Skip to content

Instantly share code, notes, and snippets.

@Garmelon
Created January 23, 2017 19:14
Show Gist options
  • Save Garmelon/6bbbd68461d480e46e3b8ae446220ed0 to your computer and use it in GitHub Desktop.
Save Garmelon/6bbbd68461d480e46e3b8ae446220ed0 to your computer and use it in GitHub Desktop.
speed bf interpreter (14 minutes)
# 18:56
# 19:10
import sys
def do_loops(code):
loopstack = []
loops = {}
for i, char in enumerate(code):
if char == "[":
loopstack.append(i)
elif char == "]":
i2 = loopstack.pop()
loops[i] = i2
loops[i2] = i
return loops
def brainfuck(code, inputstr):
loops = do_loops(code)
i = 0
pointer = 0
world = {}
output = ""
while (i<len(code)):
char = code[i]
if char == ".":
output += chr(world[pointer]) if pointer in world else chr(0)
elif char == ",":
if inputstr:
world[pointer] = ord(inputstr[0])
inputstr = inputstr[1:]
else:
world[pointer] = 0
elif char == "+":
world[pointer] = (world[pointer]+1)%256 if pointer in world else 1
elif char == "-":
world[pointer] = (world[pointer]-1)%256 if pointer in world else 255
elif char == "<":
pointer -= 1
elif char == ">":
pointer += 1
elif char == "[":
if pointer in world and world[pointer] == 0:
i = loops[i]
continue
elif char == "]":
if pointer in world and world[pointer] != 0:
i = loops[i]
continue
i += 1
return output
if __name__ == "__main__":
print(brainfuck(sys.argv[1], sys.argv[2]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment