Skip to content

Instantly share code, notes, and snippets.

@charmoniumQ
Created November 30, 2016 02:06
Show Gist options
  • Save charmoniumQ/03352e9626df356f2899cb424fabf177 to your computer and use it in GitHub Desktop.
Save charmoniumQ/03352e9626df356f2899cb424fabf177 to your computer and use it in GitHub Desktop.
My BF interpreter
import sys
def interpret(source, memory=1000, max_iterations=100000):
mem = [0] * memory
mem_ptr = 0
loop_stack = []
src_ptr = 0
iterations = 0
while True:
# safety in brainf?
iterations += 1
if iterations > max_iterations:
raise RuntimeError('Exceeded maximum iterations')
char = source[src_ptr]
if char == '>':
mem_ptr += 1
elif char == '<':
mem_ptr -= 1
elif char == '+':
mem[mem_ptr] += 1
elif char == '-':
mem[mem_ptr] -= 1
elif char == '.':
print(chr(mem[mem_ptr]), end='')
elif char == ',':
mem[mem_ptr] = ord(input()[0])
elif char == '[':
if mem[mem_ptr] != 0:
loop_stack.append(src_ptr)
else:
# find next ] and start after that
loop_nestedness = 0
while True:
src_ptr += 1
if source[src_ptr] == ']':
if loop_nestedness == 0:
break
else:
loop_nestedness -= 1
if source[src_ptr] == '[':
loop_nestedness += 1
elif char == ']':
src_ptr = loop_stack.pop() - 1
# elif char == '#':
# # let i be the first non-zero memory cell
# for i in range(len(mem) - 1, 10, -1):
# if mem[i] != 0:
# break
# print(mem[:i+1])
else:
pass
src_ptr += 1
if src_ptr >= len(source):
return mem
if __name__ == '__main__':
# copy = '[->+>+<<]>>[-<<+>>]'
# hello = '++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.'
source = ''
for line in sys.stdin:
source += line
interpret(source)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment