Skip to content

Instantly share code, notes, and snippets.

@jarhill0
Created May 10, 2017 06:13
Show Gist options
  • Save jarhill0/5cd4f88d75211f8fa41d4c0fd6077134 to your computer and use it in GitHub Desktop.
Save jarhill0/5cd4f88d75211f8fa41d4c0fd6077134 to your computer and use it in GitHub Desktop.
import time
class Cell:
def __init__(self):
self.left = None
self.right = None
self.value = 0
def increment(self):
self.value += 1
def decrement(self):
self.value -= 1
def output(self):
print(chr(self.value), end='')
def accept(self):
new_val = ''
while len(new_val) != 1:
new_val = input()
self.value = ord(new_val)
def step_right(cell):
if cell.right is None:
cell.right = Cell()
cell.right.left = cell
return cell.right
def step_left(cell):
if cell.left is None:
cell.left = Cell()
cell.left.right = cell
return cell.left
def find_closing_bracket(string):
nested_level = 0
for i, char in enumerate(string):
if char == '[':
nested_level += 1
elif char == ']':
nested_level -= 1
if nested_level == 0:
return i
raise ValueError('No closing bracket found')
def find_opening_bracket(string):
nested_level = 0
for i, char in enumerate(reversed(string)):
if char == ']':
nested_level += 1
elif char == '[':
nested_level -= 1
if nested_level == 0:
return i
raise ValueError('No opening bracket found')
def execute(code):
valid_chars = ['<', '>', '+', '-', '.', ',', '[', ']']
pointer = Cell()
code_index = 0
while True:
if code_index < len(code):
char = code[code_index]
else:
break
if char in valid_chars:
if char == '<':
pointer = step_left(pointer)
elif char == '>':
pointer = step_right(pointer)
elif char == '+':
pointer.increment()
elif char == '-':
pointer.decrement()
elif char == '.':
pointer.output()
elif char == ',':
pointer.accept()
elif char == '[':
if pointer.value == 0:
code_index += find_closing_bracket(code[code_index:])
elif char == ']':
if pointer.value != 0:
code_index -= find_opening_bracket(code[:code_index + 1])
code_index += 1
def main():
print('Brainfuck interpreter\n')
while True:
opt = ''
while opt not in ['1', '2', '3']:
opt = input('Choose option:\n(1) Enter code\n(2) Read code from file\n(3) Run "random.bf" on Desktop\n')
if opt == '1':
my_code = input('Enter the program: ')
print('\n')
elif opt == '2':
filepath = input('Enter absolute path to file: ')
print('\n')
with open(filepath, 'r') as f:
my_code = f.read()
elif opt == '3':
filepath = '/Users/jarhill/Desktop/random.bf'
print('\n')
with open(filepath, 'r') as f:
my_code = f.read()
time0 = time.time()
execute(my_code)
time1 = time.time()
print('\n\nFinished in %f seconds.\n' % (time1 - time0))
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment