I half arsedly wrote a brainfuck interpreter this evening

Had nothing better to do this evening. Thought "fuck it!" (two drums and a cymbal fall off a cliff), without any prior knowledge of writing stuff like this I'll throw myself into writing a brainfuck interpreter in python. In hindsight might've preferred to have done it in GO but eh. Was what I'd been using earlier at the time.

[removed cos shit, see later posts]

Break it to me gently, how shit is it?

1 Like

I approve :D

mehehehehe

There's quite a bit not accounted for but I've got work to do so meh

Was sat in the bath when I had a massive "DUH!" moment.

src = """
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
"""

memSize = 1000

trans = {">":"pointer+=1\n",
         "<":"pointer-=1\n",
         "+":"mem[pointer]+=1\n",
         "-":"mem[pointer]-=1\n",
         ",":"mem[pointer]=ord(input()[0])\n",
         ".":"print(chr(mem[pointer]), end=\"\")\n",
         "[":"while mem[pointer]!=0:\n",
         "]":""}

transd = """
mem = [0 for x in range({0})]
pointer = 0
""".format(memSize)

indentLevel = 0

for char in src:
    transl = trans.get(char, "")
    
    if transl != "":
        transd += "\t"*indentLevel
        transd += transl

    if char == "[":
        indentLevel += 1
    elif char == "]":
        indentLevel -= 1

exec(transd)

Kinda cheating but hey ;p

1 Like

python is such a beautiful thing sometimes...

1 Like

brainfuck interpreter sounds like a kickass band name

3 Likes

Minor change made to whittle away some time
probably still works

src = """
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
"""

memSize = 1000

trans = {">":lambda x: "pointer+={0}\n".format(x),
         "<":lambda x: "pointer+={0}\n".format(x),
         "+":lambda x: "mem[pointer]+={0}\n".format(x),
         "-":lambda x: "mem[pointer]+={0}\n".format(x),
         ",":"mem[pointer]=ord(input()[0])\n",
         ".":"print(chr(mem[pointer]), end=\"\")\n",
         "[":"while mem[pointer]!=0:\n",
         "]":""}

transd = """
mem = [0 for x in range({0})]
pointer = 0
""".format(memSize)

indentLevel = 0
pointerMove = 0
valueIncrement = 0

incrementChars = {">":1,"<":-1,"+":1,"-":-1}

for i in range(len(src)):
    if src[i] in [">","<"]:
        pointerMove += incrementChars[src[i]]

        if not src[i+1] in [">","<"]:
            transl = trans.get(src[i], "")(pointerMove)
            transd += "\t"*indentLevel
            transd += transl
            pointerMove = 0
            
    elif src[i] in ["+","-"]:
        valueIncrement += incrementChars[src[i]]

        if not src[i+1] in ["+","-"]:
            transl = trans.get(src[i], "")(valueIncrement)
            transd += "\t"*indentLevel
            transd += transl
            valueIncrement = 0
    
    else:
        transl = trans.get(src[i], "")
        
        if transl != "":
            transd += "\t"*indentLevel
            transd += transl

        if src[i] == "[":
            indentLevel += 1
        elif src[i] == "]":
            indentLevel -= 1

exec(transd)

Just counts up all of the +, -, > or < characters so instead of making loads of lines with pointer+=1 or pointer-=1, they accumulate to be pointer+=11 etc.

So now instead of doing

mem = [0 for x in range(1000)]
pointer = 0
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
while mem[pointer]!=0:
	pointer+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	pointer+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	pointer+=1
	mem[pointer]+=1
	mem[pointer]+=1
	mem[pointer]+=1
	pointer+=1
	mem[pointer]+=1
	pointer-=1
	pointer-=1
	pointer-=1
	pointer-=1
	mem[pointer]-=1
pointer+=1
mem[pointer]+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
pointer+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
print(chr(mem[pointer]), end="")
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
pointer+=1
mem[pointer]+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
pointer-=1
pointer-=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
pointer+=1
print(chr(mem[pointer]), end="")
mem[pointer]+=1
mem[pointer]+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
print(chr(mem[pointer]), end="")
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
mem[pointer]-=1
print(chr(mem[pointer]), end="")
pointer+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
pointer+=1
print(chr(mem[pointer]), end="")

it does

mem = [0 for x in range(1000)]
pointer = 0
mem[pointer]+=10
while mem[pointer]!=0:
	pointer+=1
	mem[pointer]+=7
	pointer+=1
	mem[pointer]+=10
	pointer+=1
	mem[pointer]+=3
	pointer+=1
	mem[pointer]+=1
	pointer+=-4
	mem[pointer]+=-1
pointer+=1
mem[pointer]+=2
print(chr(mem[pointer]), end="")
pointer+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
mem[pointer]+=7
print(chr(mem[pointer]), end="")
print(chr(mem[pointer]), end="")
mem[pointer]+=3
print(chr(mem[pointer]), end="")
pointer+=1
mem[pointer]+=2
print(chr(mem[pointer]), end="")
pointer+=-2
mem[pointer]+=15
print(chr(mem[pointer]), end="")
pointer+=1
print(chr(mem[pointer]), end="")
mem[pointer]+=3
print(chr(mem[pointer]), end="")
mem[pointer]+=-6
print(chr(mem[pointer]), end="")
mem[pointer]+=-8
print(chr(mem[pointer]), end="")
pointer+=1
mem[pointer]+=1
print(chr(mem[pointer]), end="")
pointer+=1
print(chr(mem[pointer]), end="")

package main

import (
	"bufio"
	"fmt"
	"io/ioutil"
	"os"
)

type bfInt struct {
	src        string
	mem        []uint8
	memPointer int
	loopstack  [][2]int
	index      int
}

func (b *bfInt) run(src string) {
	b.src = src
	b.mem = []uint8{0}
	for b.index = 0; b.index < len(b.src); {
		b.interpretChar()
		b.index++
	}
}

func (b *bfInt) getMemVal() uint8 {
	if b.memPointer >= 0 {
		return b.mem[b.memPointer]
	}
	return 0
}

func (b *bfInt) incrementMemVal(increment uint8) {
	if b.memPointer >= 0 {
		b.mem[b.memPointer] += increment
	}
}

func (b *bfInt) pushLoop(loop [2]int) {
	b.loopstack = append(b.loopstack, loop)
}

func (b *bfInt) peekLoop() [2]int {
	if len(b.loopstack) > 0 {
		return b.loopstack[len(b.loopstack)-1]
	}
	return [2]int{-1, -1}
}

func (b *bfInt) popLoop() [2]int {
	if len(b.loopstack) > 0 {
		loop := b.peekLoop()
		b.loopstack = b.loopstack[:len(b.loopstack)-1]
		return loop
	}
	return [2]int{-1, -1}
}

func (b *bfInt) interpretChar() {
	switch char := b.src[b.index]; char {
	case '>':
		b.memPointer++
		if b.memPointer >= len(b.mem) {
			b.mem = append(b.mem, 0)
		}
	case '<':
		b.memPointer--
	case '+':
		b.incrementMemVal(1)
	case '-':
		b.incrementMemVal(255)
	case '.':
		fmt.Print(string(b.getMemVal()))
	case ',':
		reader := bufio.NewReader(os.Stdin)
		input, _ := reader.ReadString('\n')
		b.mem[b.memPointer] = []byte(input)[0]
	case '[':
		if b.getMemVal() != 0 {
			b.pushLoop([2]int{b.index, -1})
		} else {
			for loopDepth := 1; loopDepth > 0; {
				b.index++
				switch char := b.src[b.index]; char {
				case '[':
					loopDepth++
				case ']':
					loopDepth--
				}
			}
		}
	case ']':
		if b.peekLoop()[1] == -1 {
			loop := b.popLoop()
			loop[1] = b.index
			b.pushLoop(loop)
		}

		if b.getMemVal() == 0 {
			b.popLoop()
		} else {
			b.index = b.peekLoop()[0]
		}
	}
}

func main() {
	filePath := os.Args[1]
	contents, _ := ioutil.ReadFile(filePath)

	bf := bfInt{}
	bf.run(string(contents))
}