Interpret brainf***
Python (no eval), 317 bytes
from sys import*
def f(u,c,k):
while(c[1]>=k)*u:
j,u='[]<>+-,.'.find(u[0]),u[1:];b=(j>=0)*(1-j%2*2);c[1]+=b*(j<2)
while b*c[c[0]]and j<1:f(u,c,k+1);c[1]+=1
b*=c[1]==k;c[[0,c[0],2][j/2-1]]+=b
if(j==6)*b:c[c[0]]=ord(stdin.read(1))
if(j>6)*b:stdout.write(chr(c[c[0]]))
f(open(argv[1]).read(),[-1]+[0]*30003,0)
brainfuck, 843 691 bytes
Edit: decided to revisit this and found a surprising number of ways to golf off bytes
>>>,[>++++[-<-------->]<-[>+<<]>[----------[>]>[<+<+>>>>]<<<-[>]>[<+<+>>>>]<<<-[>]>[<+<+>>>>]<<<-[>]>[<-<+++>>>>]<<<--------------[>]>[<++<+>>>>]<<<--[>]>[<-<+++++++>>+>>]<<++++[-<------>]+<+[>]>[<++<+>>>>]<<<--[>]>[<<+>>>>]<<-<[+]<[>]>,>]<]<-[<]>[-[<<]>[<+[>]>>[<+[<<[<]<<-[>>]<[>>>>[>]>+<<[<]<]<-[>>]<[>>>>[>]>-<<[<]<]<++[->>+<<]>>[>]>]]<<<[<]>-<]>-[<<]>[<++[>]>+>[<-]<[<<[<]>[-<<+>>]>--[<<]>[[>]>+<<[<]<]>+[<<]>[[>]>-<<[<]<]>+[>]>]<<[<]>--<]>-[<<]>[[>]>>.<<<[<]<]>-[<<]>[[>]>>-<<<[<]<]>-[<<]>[[>]>>,<<<[<]<]>-[<<]>[[>]>>+<<<[<]<]>-[<<]>[[>]>>>[>>]>[<<<[<<]<+>>>[>>]>-]>[-]<<+[<[->>+<<]<]<[->>+<<]<[<]<]>-[<<]>[[>]>-[+>[-<<+>>]>]+<<[-]+[-<<]<[->>>[>>]>+<<<[<<]<]<[<]<]<++++++++>>[+<<->>]>]
This takes input in the form code!input
where the !input
is optional. It also simulates negative cells without using negative cells itself and can store up to (30000-(length of code+6))/2
cells.
Try it online!
16 bit 8086 machine code: 168 bytes
Here's the base64 encoded version, convert and save as 'bf.com' and run from Windows command prompt: 'bf progname'
gMYQUoDGEFKzgI1XAgIfiEcBtD3NIR8HcmOL2LQ/i88z0s0hcleL2DPA86sz/zP2/sU783NHrL0I
AGgyAU14DTqGmAF194qOoAH/4UfDJv4Fwyb+DcO0AiaKFc0hw7QBzSGqT8MmODV1+jPtO/NzDaw8
W3UBRTxddfJNee/DJjg1dPoz7U509YpE/zxddQFFPFt18U157sM+PCstLixbXUxjTlJWXmV+
EDIT
Here's some assembler (A86 style) to create the executable (I had to reverse engineer this as I'd misplaced the original source!)
add dh,10h
push dx
add dh,10h
push dx
mov bl,80h
lea dx,[bx+2]
add bl,[bx]
mov [bx+1],al
mov ah,3dh
int 21h
pop ds
pop es
jb ret
mov bx,ax
mov ah,3fh
mov cx,di
xor dx,dx
int 21h
jb ret
mov bx,ax
xor ax,ax
repz stosw
xor di,di
xor si,si
inc ch
program_loop:
cmp si,bx
jnb ret
lodsb
mov bp,8
push program_loop
symbol_search:
dec bp
js ret
cmp al,[bp+symbols]
jnz symbol_search
mov cl,[bp+instructions]
jmp cx
forward:
inc di
ret
increment:
inc b es:[di]
ret
decrement:
dec b es:[di]
ret
output:
mov ah,2
mov dl,es:[di]
int 21h
ret
input:
mov ah,1
int 21h
stosb
backward:
dec di
ret
jumpforwardifzero:
cmp es:[di],dh
jnz ret
xor bp,bp
l1: cmp si,bx
jnb ret
lodsb
cmp al,'['
jnz l2
inc bp
l2: cmp al,']'
jnz l1
dec bp
jns l1
ret
jumpbackwardifnotzero:
cmp es:[di],dh
jz ret
xor bp,bp
l3: dec si
jz ret
mov al,[si-1]
cmp al,']'
jnz l4
inc bp
l4: cmp al,'['
jnz l3
dec bp
jns l3
ret
symbols:
db '><+-.,[]'
instructions:
db forward and 255
db backward and 255
db increment and 255
db decrement and 255
db output and 255
db input and 255
db jumpforwardifzero and 255
db jumpbackwardifnotzero and 255