BooleanFunge/Interpreter
Jump to navigation
Jump to search
BooleanFunge interpreter in Python, without input:
from random import randint
import os.path
import sys
# GLOBAL VARIABLES
grid = []
x = 0 # X COORDINATE OF POINTER
y = 0 # Y COORDINATE OF POINTER
direction = "right" # CURRENT DIRECTION OF MOTION
stack = [] # LIFO NUMBER STORAGE
directions = ["left", "up", "right", "down"] # ALL POSSIBLE DIRECTIONS
def main():
"""Read file and repeatedly traverse grid"""
grid = readFile()
while grid[y][x] != "@" or True in grid:
step()
def readFile():
"""Read the file at the first commandline argument and griddify it"""
# CONFIRM A FILENAME WAS GIVEN
if len(sys.argv) < 2:
print "ERROR: No input file specified!"
sys.exit()
filename = sys.argv[1]
# CONFIRM VALID FILENAME
if not os.path.isfile(filename):
print "ERROR: Specified input file does not exist!"
sys.exit()
# GET GRID DIMENSIONS
numLines = 0
lineLength = 0
with open(filename) as f:
for line in f:
numLines += 1
lineLength = max(lineLength, len(line.rstrip('\n')))
# GENERATE THE GRID
for row in range(numLines):
grid.append([])
for col in range(lineLength):
grid[row].append(" ")
# POPULATE THE GRID
with open(filename) as f:
row = 0
for line in f:
col = 0
for char in line:
if char != "\n":
grid[row][col] = char
col += 1
row += 1
return grid
def printGrid(grid):
"""
Print the contents of a given grid into the terminal
Useful for debugging
Keyword arguments:
grid -- the grid to print out
"""
for row in grid:
for col in row:
print col,
print
def step():
"""Advance the Befunge grid one step"""
processInstruction(grid[y][x],x,y)
move()
def processInstruction(instruction,x,y):
"""
Process the instruction that's currently being pointed to
Keyword arguments:
instruction -- string representation of the current instruction
"""
global direction
if instruction == " ":
pass
elif instruction == ">":
direction = "right"
stack.append(1)
elif instruction == "<":
direction = "left"
stack.append(0)
elif instruction == "^":
if len(stack) == 0:
instruction = '<'
direction = "left"
stack.append(0)
elif len(stack) == 1:
instruction = '>'
direction = "right"
stack.append(1)
else:
stack.pop(2)
direction = "up"
grid[y][x] = instruction
elif instruction == "v":
direction = "down"
stack.pop(randint(0,1))
elif instruction == "#":
value = stack.pop()
if value == 0:
direction = (directions.index(directions)+1)%4
else:
direction = (directions.index(directions)-1)%4
elif instruction == "&":
if len(stack) < 8:
grid[y][x] = "$"
else:
print(stack.pop())
def move():
"""Move the pointer in the current direction"""
global x
global y
if direction == "right":
x += 1
elif direction == "left":
x -= 1
elif direction == "up":
y -= 1
elif direction == "down":
y += 1
if x < 0:
x += len(grid[0])
elif x == len(grid[0]):
x = 0
if y < 0:
y += len(grid)
elif y == len(grid):
y = 0
main()