So I implemented this small brainfuck interpreter in python. This implementation uses 8-bit memory cells and does not allow for for values outside the 0-255 range. If this happens a ValueError will be raised. By default, the memory tape is 5000 cells long, but this can be set by the user.
Python 2.6 or later is required.
Example:
bf = Brainfuck(100) #only 100 cells on the tape twoPlusThree = "++>+++<[>+<-]" bf.run_command(twoPlusThree)
And here is the implementation:
class Brainfuck: def __init__(self, tape_length=5000): self.tape = bytearray(tape_length) self.tape_pointer = 0 def run_command(self, cmd): cmd_pointer = 0 running = True while running: if self.tape_pointer > len(self.tape) or self.tape_pointer < 0 or cmd_pointer < 0 or cmd_pointer > len(cmd) -1: break if cmd[cmd_pointer] == "+": self.tape[self.tape_pointer] += 1 elif cmd[cmd_pointer] == "-": self.tape[self.tape_pointer] -= 1 elif cmd[cmd_pointer] == "<": self.tape_pointer -= 1 elif cmd[cmd_pointer] == ">": self.tape_pointer += 1 elif cmd[cmd_pointer] == ".": print(chr(self.tape[self.tape_pointer])) elif cmd[cmd_pointer] == ",": self.tape[self.tape_pointer] = int(raw_input()) elif cmd[cmd_pointer] == "[": if int(self.tape[self.tape_pointer]) == 0: lbcounter = 0 searching = True while searching: cmdpointer +=1 if cmd[cmd_pointer] == "[": lbcounter += 1 elif lbcounter == 0 and cmd[cmd_pointer] == "]": searching = False elif cmd[cmd_pointer] == "]": lbcounter -= 1 elif cmd[cmd_pointer] == "]": if int(self.tape[self.tape_pointer]) != 0: rbcounter = 0 searching = True while searching: cmd_pointer -=1 if cmd[cmd_pointer] == "]": rbcounter += 1 elif rbcounter == 0 and cmd[cmd_pointer] == "[": searching = False elif cmd[cmd_pointer] == "[": rbcounter -= 1 cmd_pointer += 1
Stilig. Har du programmert noe annet enn 2+3 i Brainfuck? Hva med å lage en Brainfuckcompiler i den? 🙂 Har du brukt OO programmering i Python før? Synd det ikke var mer å gjøre med det i dette tilfellet.
Jeg husker jeg klarte å lage et program som kunne gange. Må prøve å lage det igjen. Dette er en stilig side hvor de har mye kult, feks. konvertering til 16-bits osv. Jeg kjørte noen av tallkonstantene med doble brackets for å sjekke at interpreteren håndterte det skikkelig. Det var jo forsåvidt det som var det vanskeligste/mest interessante å implementere.
Jeg tenkte på å gjøre dataarrayet til en egen datatype, i tillegg til å ha metoder for å “bytte tape”. Det kan man jo allerede gjøre i python:
Selv om det mest korrekte ville vært å implementere noe a la