Skip to main content

Interpret brainf*** 52 Answers 52 Perl, 120 138 16 bit 8086 machine code: 168 bytesPython 275 248 255Haskell, 457 413 charactersConveyor, 953C 284 362 (From a file)PHP 5.4, 296 294 273 263 261 209 191 183 178 166 characters:Windows PowerShell, 204C, 333 charactersExplanationF#: 489 charsDelphi, 397 382 378 371 366 364 328 charactersC, 267Ungolfed Version:C, 374 368C++11, 355, reads from file:TestC++11, 391, to see running: http://ideone.com/yZHVv Your Answer Not the answer you're looking for? Browse other questions tagged code-golf interpreter brainfuck or ask your own question.

Stack OverflowCookie PolicyPrivacy PolicyTerms of Servicebrainfuckherebase64Try it online!https://tromp.github.io/cl/cl.htmlU+2502Try it onlineClick hereInfinite output is now supported.SourceCoderthomas-kwaHello WorldRot13Wikipediahttp://codepad.viper-7.com/O9lYjlstring reverserHello Worldherea Brainfuck self-interpreter by ... not me.Try it online!Try it online!http://ideone.com/b7vO4standard loopholescode-golfterms of serviceprivacy policycookie policycc by-sa 3.0attribution required













StackExchange.ready(function () StackExchange.topbar.init( observeSize: true ); );
StackExchange.scrollPadding.setPaddingTop(50, 10);



Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It only takes a minute to sign up.



Sign up to join this community






Anybody can ask a question






Anybody can answer






The best answers are voted up and rise to the top









StackExchange.ready(function ()
StackExchange.Hero.init("nso", "a");

var location = 0;
if ($("body").hasClass("questions-page"))
location = 1;
else if ($("body").hasClass("question-page"))
location = 1;
else if ($("body").hasClass("faq-page"))
location = 5;
else if ($("body").hasClass("home-page"))
location = 3;


$('.js-cta-button').click(function ()
StackExchange.using("gps", function ()
StackExchange.gps.track("hero.action", hero_action_type: 'cta', location: location , true);
);
);

// TODO: we should review the class names and whatnot in use here. Older heroes use id selectors, the newer
// sticky question hero on SO has a .js-dismiss class instead, but it's apparently not used anywhere...
// It's not great. Ideally we'd have a set of classes in the partials above that would correspond to
// the behaviours we want here in a more clear way.

// sticky question-page hero at the bottom of the page on SO
$('.js-dismiss').on('click', function ()
StackExchange.using("gps", function ()
StackExchange.gps.track("hero.action", hero_action_type: "close", location: location , true);
);
StackExchange.Hero.dismiss();
$(".js-dismissable-hero").fadeOut("fast");
);
);























Interpret brainf***






Ask Question






Asked
8 years, 7 months ago


Active
2 months ago


Viewed
16k times








.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








112












$begingroup$


Write the shortest program in your favourite language to interpret a brainfuck program. The program is read from a file. Input and output are standard input and standard output.



  1. Cell size: 8bit unsigned. Overflow is undefined.

  2. Array size: 30000 bytes (not circled)

  3. Bad commands are not part of the input


  4. Comments begin with # and extend to the end of line Comments are everything not in +-.,[]<>

  5. no EOF symbol

A very good test can be found here. It reads a number and then prints the prime numbers up to that number. To prevent link rot, here is a copy of the code:



compute prime numbers
to use type the max number then push Alt 1 0
===================================================================
======================== OUTPUT STRING ============================
===================================================================
>++++++++[<++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++.[-]
>++++++++++[<++++++++++>-]<+++++++++.[-]
>++++++++++[<++++++++++>-]<+.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++.[-]
>+++++++[<+++++++>-]<+++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]

===================================================================
======================== INPUT NUMBER ============================
===================================================================
+ cont=1
[
- cont=0
>,
======SUB10======
----------

[ not 10
<+> cont=1
=====SUB38======
----------
----------
----------
--------

>
=====MUL10=======
[>+>+<<-]>>[<<+>>-]< dup

>>>+++++++++
[
<<<
[>+>+<<-]>>[<<+>>-]< dup
[<<+>>-]
>>-
]
<<<[-]<
======RMOVE1======
<
[>+<-]
]
<
]
>>[<<+>>-]<<

===================================================================
======================= PROCESS NUMBER ===========================
===================================================================

==== ==== ==== ====
numd numu teid teiu
==== ==== ==== ====

>+<-
[
>+
======DUP======
[>+>+<<-]>>[<<+>>-]<

>+<--

>>>>>>>>+<<<<<<<< isprime=1

[
>+

<-

=====DUP3=====
<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<

=====DUP2=====
>[>>+>+<<<-]>>>[<<<+>>>-]<<< <


>>>


====DIVIDES=======
[>+>+<<-]>>[<<+>>-]< DUP i=div

<<
[
>>>>>+ bool=1
<<<
[>+>+<<-]>>[<<+>>-]< DUP
[>>[-]<<-] IF i THEN bool=0
>>
[ IF i=0
<<<<
[>+>+<<-]>>[<<+>>-]< i=div
>>>
- bool=0
]
<<<
- DEC i
<<
-
]

+>>[<<[-]>>-]<<
>[-]< CLR div
=====END DIVIDES====


[>>>>>>[-]<<<<<<-] if divides then isprime=0


<<

>>[-]>[-]<<<
]

>>>>>>>>
[
-
<<<<<<<[-]<<

[>>+>+<<<-]>>>[<<<+>>>-]<<<

>>




===================================================================
======================== OUTPUT NUMBER ===========================
===================================================================
[>+<-]>

[
======DUP======
[>+>+<<-]>>[<<+>>-]<


======MOD10====
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>-] if ten=0 ten=10
<<- dec ten
<- dec num
]
+++++++++ num=9
>[<->-]< dec num by ten

=======RROT======
[>+<-]
< [>+<-]
< [>+<-]
>>>[<<<+>>>-]
<

=======DIV10========
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
<<- dec ten
<- dec num
]
>>>>[<<<<+>>>>-]<<<< copy div to num
>[-]< clear ten

=======INC1=========
<+>
]

<
[
=======MOVER=========
[>+<-]

=======ADD48========
+++++++[<+++++++>-]<->

=======PUTC=======
<.[-]>

======MOVEL2========
>[<<+>>-]<

<-
]

>++++[<++++++++>-]<.[-]

===================================================================
=========================== END FOR ===============================
===================================================================


>>>>>>>
]
<<<<<<<<



>[-]<
[-]
<<-
]

======LF========

++++++++++.[-]
@


Example run:



$ python2 bf.py PRIME.BF 
Primes up to: 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97









share|improve this question











$endgroup$









  • 5




    $begingroup$
    You should clarify about 1) size of memory 2) is memory circled 4) maybe any other details
    $endgroup$
    – Nakilon
    Jan 28 '11 at 1:37






  • 3




    $begingroup$
    I wonder if there should be two categories: Those programs that use eval (or shell out to compile) -- and those that don't.
    $endgroup$
    – MtnViewMark
    Feb 15 '11 at 7:52






  • 34




    $begingroup$
    I'd love to see someone answer this in brainfuck.
    $endgroup$
    – Hannesh
    Mar 14 '11 at 19:15






  • 3




    $begingroup$
    What does "no EOF symbol" mean? That the cell value remains unchanged when trying , on EOF? Or that it's up to us to choose a value when trying , on EOF? Or is EOF undefined behaviour altogether?
    $endgroup$
    – Martin Ender
    Apr 1 '16 at 14:07






  • 3




    $begingroup$
    Likewise, what should happen when someone tries to leave the 30k cells to either side? Should the tape head remain in place or is this undefined behaviour?
    $endgroup$
    – Martin Ender
    Apr 1 '16 at 14:09

















52 Answers
52






active

oldest

votes













1 2
next












46













$begingroup$

Perl, 120 138



%c=qw(> $p++ < $p-- + D++ - D-- [ while(D) ] . print+chrD , D=ord(getc));
$/=$,;$_=<>;s/./$c$&;/g;s[D]'$b[$p]'g;eval


This runs hello.bf and primes.bf flawlessly:



$ perl bf.pl hello.bf
Hello World!
$ perl bf.pl prime.bf
Primes up to: 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97


Initialization: The opcode to Perl translation table is stored in %c. The readable form looks like this:



%c=(
'>' => '$p++',
'<' => '$p--',
'+' => '$b[$p]++',
'-' => '$b[$p]--',
'[' => 'while($b[$p])',
']' => '',
'.' => 'print chr$b[$p]',
',' => '$b[$p]=ord(getc)',
);


Step 1: Slurp program input to $_ and transform it to Perl code using the translation table. Comments are automatically stripped (replaced with undef) in this step.



Step 2: Uncompress all $b[$p] occurrences



Step 3: Launch the program using eval.






share|improve this answer











$endgroup$














  • $begingroup$
    Just use Perl's qw syntax to define %c directly -- good for 7 fewer chars (you'll have to say print+chr$b[$p] and ord(getc), though)
    $endgroup$
    – mob
    Sep 11 '12 at 23:36










  • $begingroup$
    I count 18 saved… thanks! (updating in a minute)
    $endgroup$
    – J B
    Sep 12 '12 at 8:19






  • 1




    $begingroup$
    @olivecoder What on earth are you talking about?
    $endgroup$
    – J B
    Sep 19 '12 at 7:12










  • $begingroup$
    The %c table is declared and defined in the first line; its characters are perfectly accounted for.
    $endgroup$
    – J B
    Sep 19 '12 at 13:46










  • $begingroup$
    @JB hey, I accidentally pressed down vote on your answer and it is locked in, can you edit this so I can reverse the down Vote?
    $endgroup$
    – Cyclohexanol.
    Sep 9 '15 at 0:38


















64













$begingroup$

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)





share|improve this answer











$endgroup$










  • 69




    $begingroup$
    +1 for the f(u,c,k)
    $endgroup$
    – Joel Cornett
    Aug 4 '12 at 21:48






  • 8




    $begingroup$
    That is one beautiful piece of noise, sir
    $endgroup$
    – globby
    Dec 6 '14 at 1:44










  • $begingroup$
    -1 byte if you replace while b*c[c[0]]and j<1 with while b*c[c[0]]*(j<1)
    $endgroup$
    – Daniil Tutubalin
    Jun 24 at 7:58


















49













$begingroup$

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





share|improve this answer











$endgroup$














  • $begingroup$
    I've added a source code version of the program. I've just noticed that non-bf characters cause the program to exit rather than be ignored. Easy to fix that and I'll leave it as an exercise for people to do that themselves.
    $endgroup$
    – Skizz
    Aug 14 '12 at 13:18










  • $begingroup$
    I remember I got the Linux ELF version 166 bytes, 10 years ago, here muppetlabs.com/~breadbox/software/tiny
    $endgroup$
    – Emmanuel
    Jul 28 '14 at 17:34



















34













$begingroup$


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!






share|improve this answer











$endgroup$






















    27













    $begingroup$

    Ruby 1.8.7, 188 185 149 147 characters



    eval"a=[i=0]*3e4;"+$<.bytes.mapb*";"


    Somewhat readable version:



    code = "a = [0] * 3e4; i = 0;"
    more_code ARGF.bytes.map .join(";")
    eval code+more_code


    As you see I shamelessly stole your idea of translating to the host language and then using eval to run it.






    share|improve this answer











    $endgroup$














    • $begingroup$
      You can shave off a byte byte comparing to zero >0 rather than testing equality: !=0. The specs say unsigned, and overflow is undefined.
      $endgroup$
      – anonymous coward
      Feb 6 '11 at 5:32










    • $begingroup$
      3e4 will also work as opposed to 30000
      $endgroup$
      – anonymous coward
      Feb 6 '11 at 5:36










    • $begingroup$
      @Charlie: Thanks. Though to be fair it didn't say "unsigned" when I wrote the code. I honestly didn't know that you could write 3e4 though. That's a very good point and good to know.
      $endgroup$
      – sepp2k
      Feb 6 '11 at 5:40










    • $begingroup$
      File.read($*.pop).bytes -> $<.bytes should work too
      $endgroup$
      – Arnaud Le Blanc
      Feb 12 '11 at 22:31






    • 1




      $begingroup$
      Ruby 1.8.7 has an even shorter syntax to build a literal hash: ?a,"foo", which is equivalent to ?a=>"foo". And testing here shows that you actually can replace File.read($*.pop).bytes with $< without any problems. Also inlining everything to something like eval"a[0]..."+$<.bytes.map?.,"putc a[i]",...*";" shortens the solution by another few characters.
      $endgroup$
      – Ventero
      Feb 14 '11 at 15:58


















    26













    $begingroup$

    Binary Lambda Calculus 112



    The program shown in the hex dump below



    00000000 44 51 a1 01 84 55 d5 02 b7 70 30 22 ff 32 f0 00 |DQ...U...p0".2..|
    00000010 bf f9 85 7f 5e e1 6f 95 7f 7d ee c0 e5 54 68 00 |....^.o..}...Th.|
    00000020 58 55 fd fb e0 45 57 fd eb fb f0 b6 f0 2f d6 07 |XU...EW....../..|
    00000030 e1 6f 73 d7 f1 14 bc c0 0b ff 2e 1f a1 6f 66 17 |.os..........of.|
    00000040 e8 5b ef 2f cf ff 13 ff e1 ca 34 20 0a c8 d0 0b |.[./......4 ....|
    00000050 99 ee 1f e5 ff 7f 5a 6a 1f ff 0f ff 87 9d 04 d0 |......Zj........|
    00000060 ab 00 05 db 23 40 b7 3b 28 cc c0 b0 6c 0e 74 10 |....#@.;(...l.t.|
    00000070


    expects its input to consist of a Brainfuck program
    (looking only at bits 0,1,4 to distinguish among ,-.+<>][ )
    followed by a ], followed by the input for the Brainfuck program.



    Save the above hex dump with xxd -r > bf.Blc



    Grab a blc interpreter from https://tromp.github.io/cl/cl.html



    cc -O2 -DM=0x100000 -m32 -std=c99 uni.c -o uni
    echo -n "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.]" > hw.bf
    cat bf.Blc hw.bf | ./uni


    Hello World!






    share|improve this answer











    $endgroup$










    • 1




      $begingroup$
      Why does this even exist? Apparently, it even exists in the realm of research. O.o
      $endgroup$
      – Isiah Meadows
      Dec 4 '14 at 4:11










    • $begingroup$
      So this wouldn't work with commented brainfuck programs?
      $endgroup$
      – kamoroso94
      Feb 15 '18 at 20:05










    • $begingroup$
      No, not without stripping out the comments first.
      $endgroup$
      – John Tromp
      Feb 16 '18 at 22:27


















    17













    $begingroup$


    Retina 0.8.2, 386 391 386 bytes



    Code contains unprintable NUL (0x00) characters. It's also not super golfed yet, because it's already really slow, and if I golf it more, I don't know how long it'd take to finish. Appears to time out on the prime-finding sample.



    There may be bugs in the online interpreter or in my program (leading new lines don't show in the output?).



    Takes input like <code>│<input>. No, that is not a pipe (|). It's the Unicode character U+2502. The code also uses the Unicode characters ÿ▶◀├║. Unicode characters are used in order to support input of all ASCII characters. Therefore, these characters need to be separated from the code by a non-ASCII character.



    Try it online



    s`^.*
    ▶$0├║▶
    s`(▶>.*║.*)▶(.)(.?)
    $1$2▶$3
    ▶$

    ║▶
    ║▶
    (▶<.*║.*)(.)▶
    $1▶$2
    T`ÿ-`o`(?<=▶+.*║.*▶).
    ^+

    T`-ÿ`ÿo`(?<=▶-.*║.*▶).
    ^-

    (▶..*├.*)(║.*▶)(.)
    $1$3$2$3
    (▶,.*│)(.?)(.*├.*▶).
    $1$3$2
    ▶[(.*║.*▶)
    [▶▶$1
    `(▶▶+)([^[]]*)[
    $2[$1▶
    `▶(▶+)([^[]]*)]
    $2]$1
    r`([[]]*)▶](.*║.*▶[^])
    $1◀◀]$2
    r`[([^[]]*)(◀+)◀
    $2[$1
    `]([^[]]*)(◀◀+)
    $2◀]$1


    `▶([^│])(.*║)
    $1▶$2
    s`.*├|║.*


    Note there is a trailing newline there.



    Brief Explanation:



    Zeros 0x00 are used for the tape, which is infinite. The first replacement sets up the interpreter in the form ▶<code>│<input>├<output>║▶<tape>, where the first is the pointer for the code, and the second one is the pointer for the tape.



    ÿ is 0xFF (255), which is used for Transliteration (used to implement + and -) to wrap the cells back around to zero.



    is only used for readability (in case the program is stopped in the middle or you want to see the program mid-execution). Otherwise, you couldn't tell which way the pointer was moving.



    Commented Code:



    s`^.* # Initialize
    ▶$0├║▶
    s`(▶>.*║.*)▶(.)(.?) # >
    $1$2▶$3
    ▶$

    ║▶ # <
    ║▶
    (▶<.*║.*)(.)▶
    $1▶$2
    T`ÿ-`o`(?<=▶+.*║.*▶). # +
    ^+

    T`-ÿ`ÿo`(?<=▶-.*║.*▶). # -
    ^-

    (▶..*├.*)(║.*▶)(.) # .
    $1$3$2$3
    (▶,.*│)(.?)(.*├.*▶). # ,
    $1$3$2
    ▶[(.*║.*▶) # [
    [▶▶$1
    `(▶▶+)([^[]]*)[
    $2[$1▶
    `▶(▶+)([^[]]*)]
    $2]$1
    r`([[]]*)▶](.*║.*▶[^]) # ]
    $1◀◀]$2
    r`[([^[]]*)(◀+)◀
    $2[$1
    `]([^[]]*)(◀◀+)
    $2◀]$1


    `▶([^│])(.*║) # next instruction
    $1▶$2
    s`.*├|║.* # print output


    Click here for the code with zeros in place of null bytes. Any occurrences of $0 should not be replaced with nulls.



    Edit: Now supports empty input and suppresses trailing newline.



    Infinite output is now supported. (403 bytes)






    share|improve this answer











    $endgroup$














    • $begingroup$
      I kind of wish that I'd placed the <code> and the <tape> next to each other (though it'd be more characters) so that transitioning to an SMBF interpreter would be easier, if I ever decide to do that.
      $endgroup$
      – mbomb007
      Jul 20 '16 at 16:43


















    13













    $begingroup$

    TI-BASIC, 264 bytes



    Because of limitations in TI-BASIC, this actually doesn't qualify for this challenge since it breaks rule 2; the calculators' RAM is very limited, and doing something like 30000->dim(L1 (I use L1 for the stack/array) will force it to throw an ERR:MEMORY. As such, the stack/array starts at a size of 1 and grows if the pointer is pointing to an element past the end of it. It also breaks rule 3, because it's already breaking rule 2 so I may as well not bother with a cell-size limit.



    Could probably still be golfed, by the way... I've made one or two edits to that end since first submitting, but if the version below doesn't work then head back to the edit from May 6 '15 and use that code instead. Also, as there's really no ASCII in TI-BASIC, this takes numbers of any size (and anything that returns a number, like a variable or expression) as input, and outputs numbers in turn.



    Use SourceCoder to build it into a .8xp file then send it to your calculator with TI-Connect or TILP or something, and run it by including your brainfuck program in double quotes followed by a colon and whatever you named the TI-BASIC program. For instance, if you named it BRAINF, you'd run a program like this: "brainfuck goes here":prgmBRAINF.
    If you have a shell on your calc that intercepts other commands when it detects the prgm token, though, do this: "brainfuck goes here" -> press ENTER -> prgmBRAINF.



    seq(inString("<>-+.,[]",sub(Ans,S,1)),S,1,length(Ans->L2
    cumSum((Ans=7)-(Ans=8->L3
    seq(Ans(X),X,dim(Ans),1,~1->L4
    1->P:DelVar L11->dim(L1 //this is the same as DelVar L1:1->dim(L1 as DelVar does not require a colon or newline after its argument
    For(S,1,dim(L2
    L2(S->T
    P-(T=1)+(T=2->P
    dim(L1
    Ans+(P-Ans)(P>Ans->dim(L1
    L1(P)-(T=3)+(T=4->L1(P
    If T=5
    Disp Ans
    If T=6:Then
    Input V
    V->L1(P
    End
    If T=7 and not(L1(P
    S+2+sum(not(cumSum(L3(S)-1=seq(L3(X),X,S+1,dim(L3->S
    1-S+dim(L3
    If T=8 and L1(P
    S-sum(not(cumSum(L4(Ans)=seq(L4(X),X,Ans+1,dim(L4->S
    End


    If you don't have a way of connecting your calculator to your computer and want to type this out on-calc instead (I can't imagine why you'd want to, but I digress) note that -> is the STO> button above the ON key, ~ is the negative symbol next to ENTER, and to replace all instances of L<number> with the corresponding list token found on 2ND -> <number on keypad>



    Thanks to thomas-kwa (at least, I think that's his Stack username) for helping me optimize this, especially with the [ and ] instructions.






    share|improve this answer











    $endgroup$










    • 1




      $begingroup$
      Do you need the parens around Ans+S?
      $endgroup$
      – Zacharý
      Jul 7 '17 at 13:16










    • $begingroup$
      @Zacharý Good catch, no. I must have been unsure about how PEMDAS works or something... I'll refrain from editing, however, because it's been so long that it definitely isn't worth it to bump this post up to the front and because a two-byte reduction isn't going to give the answer any sort of advantage over the others lol.
      $endgroup$
      – M. I. Wright
      Aug 6 '17 at 23:23






    • 1




      $begingroup$
      I remember like 2-3 years ago when I used this program to interpret Brainf*** on my calculator. And, it's an interpret brainf*** question, I think it should be at the top to be honest.
      $endgroup$
      – Zacharý
      Aug 6 '17 at 23:42






    • 1




      $begingroup$
      Actually, I think that whole line could be S-sum(not(cumSum(L4(Ans)=seq(L4(X),X,Ans+1,dim(L4->S. (a-a=0). And hey, don't worry about forgetting ONE order of operation thing here, I've seen a whole host of people forget order of operations for % (mod) on a challenge.
      $endgroup$
      – Zacharý
      Aug 6 '17 at 23:46







    • 1




      $begingroup$
      Oh dang, yeah. Okay, that gives at least 10 bytes off since the if can be made a one-liner as well, plus some other things... may as well edit, then. You've made me whip my calculator out for the first time in like a year to check this stuff, haha
      $endgroup$
      – M. I. Wright
      Aug 7 '17 at 0:12



















    12













    $begingroup$

    Python 275 248 255



    I decided to give it a try.



    import sys
    i=0
    b=[0]*30000
    t=''
    for e in open(sys.argv[1]).read():
    t+=' '*i+['i+=1','i-=1','b[i]+=1','b[i]-=1','sys.stdout.write(chr(b[i]))','b[i]=ord(sys.stdin.read(1))','while b[i]:','pass','']['><+-.,['.find(e)]+'n'
    i+=(92-ord(e))*(e in'][')
    exec t





    share|improve this answer











    $endgroup$










    • 12




      $begingroup$
      Neat, you are generating python source code using brainfuck.
      $endgroup$
      – user11
      Jan 30 '11 at 2:00






    • 1




      $begingroup$
      You may strip 1 char, "import sys as s" and replace "sys" to "s" in the rest
      $endgroup$
      – YOU
      Feb 6 '11 at 6:52










    • $begingroup$
      Note that this is actually 247 chars. (See the nasty space after exec t?). If you use S.Mark's tip and also make the whole for cycle into one line, you can shrink this to 243 chars.
      $endgroup$
      – Oleh Prypin
      Apr 4 '11 at 15:18











    • $begingroup$
      This fails on any input containing [], a valid though trivial bf program. I've suggested an edit which fixes this, but increases the character count. To further reduce the character count, you can from sys import *, and use 'i+=1,...'.split(',') instead of ['i+=1',...].
      $endgroup$
      – boothby
      Jul 5 '11 at 20:19






    • 7




      $begingroup$
      I'd +1, but many improvements have been suggested and not implemented.
      $endgroup$
      – mbomb007
      Nov 15 '16 at 17:01


















    11













    $begingroup$

    Haskell, 457 413 characters



    import IO
    import System
    z=return
    '>'#(c,(l,d:r))=z(d,(c:l,r))
    '<'#(d,(c:l,r))=z(c,(l,d:r))
    '+'#(c,m)=z(succ c,m)
    '-'#(c,m)=z(pred c,m)
    '.'#t@(c,_)=putChar c>>hFlush stdout>>z t
    ','#(_,m)=getChar>>=(c->z(c,m))
    _#t=z t
    _%t@('',_)=z t
    i%t=i t>>=(i%)
    b('[':r)=k$b r
    b(']':r)=(z,r)
    b(c:r)=f(c#)$b r
    b[]=(z,[])
    f j(i,r)=(t->j t>>=i,r)
    k(i,r)=f(i%)$b r
    main=getArgs>>=readFile.head>>=($('',("",repeat ''))).fst.b


    This code "compiles" the BF program into an IO action of the form State -> IO State the state is a zipper on an infinite string.



    Sad that I had to expend 29 characters to turn buffering off. Without those, it works, but you don't see the prompts before you have to type input. The compiler itself (b, f, and k) is just 99 characters, the runtime (# and %) is 216. The driver w/initial state another 32.



    >ghc -O3 --make BF.hs 
    [1 of 1] Compiling Main ( BF.hs, BF.o )
    Linking BF ...

    >./BF HELLO.BF
    Hello World!

    >./BF PRIME.BF
    Primes up to: 100
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97


    update 2011-02-15: Incorporated J B's suggestions, did a little renaming, and tightened up main






    share|improve this answer











    $endgroup$










    • 1




      $begingroup$
      You should be able to get the buffering from just IO, and the arguments from just System (-19). The buffering issue bothers me as well, as the spec doesn't really mention it and the top-voted answer doesn't even do I/O. If you must keep it, it's probably shorter to hFlush after each write than change the global buffering mode (-34+15).
      $endgroup$
      – J B
      Feb 15 '11 at 10:49


















    11













    $begingroup$

    Conveyor, 953



    This might be the most beautiful code you will ever see:



    0

    :I1@p
    >#====)
    ^#====<
    PP0
    P<=======================<
    00t:)01t1 a:P:P:P:P:P:P:^
    >===========">">2>">2>">"^
    ^ +^-^5^ ^5^]^.^
    ^ "^"^*^"^*^"^"^
    ^ -^-^6^-^6^-^-^
    ^ #^#^*^#^*^#^#^
    ^ P P -^P )^P P
    ^ P P #^P )^P P
    ^t1)t0:))t01 P -^ 1
    ^===========< P #^ 0
    ^ t1(t0:))t01 P t
    ^=============< P )
    ^ t11(t01 0 0 )
    ^===============<. t P 10
    ^ FT#T#=<
    ^=================< P
    ^ t11)t01
    ^===================< 10t))0tP00t:(01t(1a:P:
    ^ >=====#=>==========">"
    ^ ^ ]^[
    ^ P ^ "^"
    ^===========================<=^#=====< -^-
    ^==< ^ PP#^#=
    ^===PTPT<
    ^ )P P
    ^=<=< (
    ^===<





    share|improve this answer











    $endgroup$










    • 8




      $begingroup$
      Could you add an explanation and a link to an implementation? I want to understand the beauty. ;)
      $endgroup$
      – DLosc
      May 12 '15 at 22:47






    • 1




      $begingroup$
      Well, I'm currently developing it, there is a compiler and a very bad explanation at github.com/loovjo/Conveyor. The source is pretty readable if you want to understand it.
      $endgroup$
      – Loovjo
      May 13 '15 at 8:30


















    9













    $begingroup$

    C 284 362 (From a file)



    #include <stdio.h>
    char b[30000],z[9999],*p=b,c,*a,i;f(char*r,int s)while(c=*a++)if(!s)(c-62)?(c-60)?(c-43)?(c-45)?(c-46)?(c-44)?0:(*p=getchar()):putchar(*p):--*p:++*p:--p:++p;if(c==91)f(a,!*p);else if(c==93)if(!*p)return;else a=r;elseif(c==93)--s;if(!*p&&!s)return;else if(c==91)s++;main(int c,char**v)fread(z,1,9999,fopen(*++v,"r"));a=z;f(0,0);


    Primes:




    Primes up to: 100
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
    Press any key to continue . . .


    Compiled and ran successfully VS2008



    Original solution failed to recognize loops that were initially set to zero. Still some room to golf. But finally solves the Prime Number program.



    Ungolfed:



    #include <stdio.h>
    char b[30000],z[9999],*p=b,c,*a,i;
    f(char*r,int s)

    while(c=*a++)

    if(!s)

    (c-62)?(c-60)?(c-43)?(c-45)?(c-46)?(c-44)?0:(*p=getchar()):putchar(*p):--*p:++*p:--p:++p;
    if(c==91)f(a,!*p);
    else if(c==93)if(!*p)return;else a=r;

    else

    if(c==93)

    --s;
    if(!*p&&!s)return;

    else if(c==91)

    s++;





    main(int c,char**v)
    fread(z,1,9999,fopen(*++v,"r"));
    a=z;
    f(0,0);



    Tests:



    Hello World



    Rot13






    share|improve this answer











    $endgroup$














    • $begingroup$
      Are you checking the same pointer (l) every time you loop? I think you are supposed to check the current location of the head (p).
      $endgroup$
      – Alexandru
      Jan 30 '11 at 19:51










    • $begingroup$
      I pass the pointer to the buffer and the pointer to the stream. It checks at the end of the loop to see if the pointer l in the buffer has reached zero and breaks else it resets the stream back to the original loop [. This is necessary for nested [ loops.
      $endgroup$
      – snmcdonald
      Jan 30 '11 at 20:00







    • 1




      $begingroup$
      Yeah. I thought so. You should not check the value at pointer at first enter in the loop, but the value at the current pointer. Check the test in the question. Your program hangs.
      $endgroup$
      – Alexandru
      Jan 30 '11 at 20:10







    • 1




      $begingroup$
      You can replace break;else by return;.
      $endgroup$
      – Alexandru
      Jan 30 '11 at 20:56






    • 3




      $begingroup$
      I think you can replace (c==62)?a:b with (c-62)?b:a.
      $endgroup$
      – Alexandru
      Jan 30 '11 at 22:01



















    9













    $begingroup$

    PHP 5.4, 296 294 273 263 261 209 191 183 178 166 characters:



    I gave it a shot without using eval, but I eventually had to use it



    <?$b=0;eval(strtr(`cat $argv[1]`,["]"=>'}',"["=>'while($$b)',"."=>'echo chr($$b);',","=>'$$b=fgetc(STDIN);',"+"=>'$$b++;',"-"=>'$$b--;',">"=>'$b++;',"<"=>'$b--;']));


    All commands are working. This heavily abuses variable variables, and spews warnings. However, if one changes their php.ini to squelch warnings (or pipes stderr to /dev/null), this works great.



    Verification (It's the "Hello World!" example from Wikipedia): http://codepad.viper-7.com/O9lYjl



    Ungolfed, 367 365 335 296 267 characters:



    <?php
    $a[] = $b = 0;
    $p = implode("",file($argv[1])); // Shorter than file_get_contents by one char
    $m = array("]" => '', "[" => 'while($a[$b]){',"." => 'echo chr($a[$b]);', "," => '$a[$b]=fgetc(STDIN);', "+" => '$a[$b]++;', "-" => '$a[$b]--;', ">" => '$b++;', "<" => '$b--;');
    $p = strtr($p,$m);
    @eval($p);


    This should be run via the command line: php bf.php hello.bf






    share|improve this answer











    $endgroup$






















      8













      $begingroup$

      Windows PowerShell, 204



      '$c=,0*3e4;'+@62='$i++
      ';60='$i--
      ';43='$c[$i]++
      ';45='$c[$i]--
      ';44='$c[$i]=+[console]::ReadKey().keychar
      ';46='write-host -n([char]$c[$i])
      ';91='for(;$c[$i])';93=''[[int[]][char[]]"$(gc $args)"]|iex


      Fairly straightforward conversion of the instructions and then Invoke-Expression.



      History:



      • 2011-02-13 22:24 (220) First attempt.

      • 2011-02-13 22:25 (218) 3e4 is shorter than 30000.

      • 2011-02-13 22:28 (216) Unnecessary line breaks. Matching on integers instead of characters is shorter.

      • 2011-02-13 22:34 (207) Used indexes into a hash table instead of the switch.

      • 2011-02-13 22:40 (205) Better cast to string removes two parentheses.

      • 2011-02-13 22:42 (204) No need for a space after the argument to Write-Host.





      share|improve this answer











      $endgroup$






















        8













        $begingroup$

        C, 333 characters



        This is my first BF interpreter and the first golf I actually had to debug.



        This runs the prime number generator on Mac OS X/GCC, but an additional #include<string.h> may be necessary at a cost of 19 more characters if the implicit definition of strchr doesn't happen to work on another platform. Also, it assumes O_RDONLY == 0. Aside from that, leaving int out of the declaration of M saves 3 characters but that doesn't seem to be C99 compliant. Same with the third * in b().



        This depends on the particulars of ASCII encoding. The Brainfuck operators are all complementary pairs separated by a distance of 2 in the ASCII code space. Each function in this program implements a pair of operators.



        #include<unistd.h>
        char C[30000],*c=C,o,P[9000],*p=P,*S[9999],**s=S,*O="=,-\",*t;
        m()c+=o;
        i()*c-=o;
        w()o<0?*c=getchar():putchar(*c);
        b()if(o>0)*c?p=*s:*--s;else if(*c)*++s=p;else while(*p++!=93)*p==91&&b();
        int(*M[])()=m,i,w,b;
        main(int N,char**V)
        read(open(V[1],0),P,9e3);
        while(o=*p++)
        if(t=strchr(O,++o&~2))
        o-=*t+1,
        M[t-O]();






        share|improve this answer











        $endgroup$














        • $begingroup$
          I think you can shrink it more by using the 'e' notation for all the big numbers.
          $endgroup$
          – luser droog
          Aug 16 '11 at 4:34










        • $begingroup$
          @luser: I was initially surprised too, but the language and compiler won't allow that. I did manage to shrink another 4 chars with tweaks, and using a #define instead of the function table would also probably be terser. I just like the number 333 and the table :v) .
          $endgroup$
          – Potatoswatter
          Aug 16 '11 at 5:56










        • $begingroup$
          Oh, right. I really should've known that. E-notation is in the production for a floating-point constant, whereas a declaration requires an integer. BTW, this may be cheating, but check out nieko.net/projects/brainfuck for Urban Müller's version. The biggest gain appears to be heavy use of ||.
          $endgroup$
          – luser droog
          Aug 16 '11 at 6:10



















        8













        $begingroup$

        CJam, 75 bytes



        lq3e4Vc*@"-<[],.+>"#"T1$T=(t T(:T; _T=g +(@T@t _T=o "_'(')er+S/=%s~@


        Try it online: string reverser, Hello World.



        Explanation



        Takes code on the first line of STDIN and input on all lines below it.



        l Read a line from STDIN (the program) and push it.
        q Read the rest of STDIN (the input) and push it.
        3e4Vc* Push a list of 30000 '' characters.
        @ Rotate the stack so the program is on top.

        % Apply this to each character in prog:
        "-<[],.+>"# Map '-' to 0, '<' to 1, ... and everything else to -1.
        ...= Push a magical list and index from it.

        s~ Concatenate the results and evaluate the resulting string as CJam code.
        @ Rotate the top three elements again -- but there are only two, so the
        program terminates.


        What about that magical list?



        "T1$T=(t T(:T; _T=g +(@T@t _T=o " Space-separated CJam snippets.
        (Note the final space! We want an empty
        string at the end of the list.)
        _'(')er+ Duplicate, change (s to )s, append.
        S/ Split over spaces.


        The resulting list is as follows:



        T1$T=(t (-)
        T(:T; (<)
        ([)
        _T=g (])
        +(@T@t (,)
        _T=o (.)
        T1$T=)t (+)
        T):T; (>)
        (unused)
        _T=g (unused)
        +(@T@t (unused)
        _T=o (unused)
        (all other characters)


        We generate the snippets for + and > from those for - and <, simply by changing left parens (CJam’s “decrement”) into right parens (CJam’s “increment”).






        share|improve this answer











        $endgroup$














        • $begingroup$
          Shortest answer & biggest winner
          $endgroup$
          – Jack Giffin
          May 15 '18 at 0:32


















        7













        $begingroup$

        F#: 489 chars



        The following program doesn't jump at '[' / ']' instructions, but scans the source code for the next matching token. This of course makes it kind of slow, but it can still find the primes under 100. F# integer types don't overflow but wrap.



        Here's the short version:



        [<EntryPoint>]
        let M a=
        let A,B,i,p,w=Array.create 30000 0uy,[|yield!System.IO.File.ReadAllText a.[0]|],ref 0,ref 0,char>>printf"%c"
        let rec g n c f a b=if c then f i;if B.[!i]=a then g(n+1)c f a b elif B.[!i]=b then(if n>0 then g(n-1)c f a b)else g n c f a b
        while !i<B.Length do(let x=A.[!p]in match B.[!i]with|'>'->incr p|'<'->decr p|'+'->A.[!p]<-x+1uy|'-'->A.[!p]<-x-1uy|'.'->w x|','->A.[!p]<-byte<|stdin.Read()|'['->g 0(x=0uy)incr '['']'|']'->g 0(x>0uy)decr ']''['|_->());incr i
        0


        A nasty gotcha was that the primes.bf program chokes on windows newlines. In order to run it I had to save the input number to a UNIX formatted text document and feed it to the program with a pipe:



        interpret.exe prime.bf < number.txt


        Edit: entering Alt+010 followed by Enter also works in Windows cmd.exe



        Here's the longer version:



        [<EntryPoint>]
        let Main args =
        let memory = Array.create 30000 0uy
        let source = [| yield! System.IO.File.ReadAllText args.[0] |]
        let memoryPointer = ref 0
        let sourcePointer = ref 0
        let outputByte b = printf "%c" (char b)
        let rec scan numBraces mustScan adjustFunc pushToken popToken =
        if mustScan then
        adjustFunc sourcePointer
        if source.[!sourcePointer] = pushToken then
        scan (numBraces + 1) mustScan adjustFunc pushToken popToken
        elif source.[!sourcePointer] = popToken then
        if numBraces > 0 then scan (numBraces - 1) mustScan adjustFunc pushToken popToken
        else
        scan numBraces mustScan adjustFunc pushToken popToken

        while !sourcePointer < source.Length do
        let currentValue = memory.[!memoryPointer]
        match source.[!sourcePointer] with
        | '>' -> incr memoryPointer
        | '<' -> decr memoryPointer
        | '+' -> memory.[!memoryPointer] <- currentValue + 1uy
        | '-' -> memory.[!memoryPointer] <- currentValue - 1uy
        | '.' -> outputByte currentValue
        | ',' -> memory.[!memoryPointer] <- byte <| stdin.Read()
        | '[' -> scan 0 (currentValue = 0uy) incr '[' ']'
        | ']' -> scan 0 (currentValue > 0uy) decr ']' '['
        | _ -> ()
        incr sourcePointer
        0





        share|improve this answer











        $endgroup$














        • $begingroup$
          I solved the Enter issue by not pressing it but Ctrl+J :-)
          $endgroup$
          – Joey
          Feb 14 '11 at 8:11










        • $begingroup$
          Ctrl+J didn't work for me, but entering Alt+010 followed by Enter did.
          $endgroup$
          – cfern
          Feb 14 '11 at 9:28


















        7













        $begingroup$

        Delphi, 397 382 378 371 366 364 328 characters



        Eat this Delphi!



        328 var p,d:PByte;f:File;z:Word=30000;x:Int8;begin p:=AllocMem(z+z);d:=p+z;Assign(F,ParamStr(1));Reset(F,1);BlockRead(F,p^,z);repeat z:=1;x:=p^;case x-43of 1:Read(PChar(d)^);3:Write(Char(d^));0,2:d^:=d^+44-x;17,19:d:=d+x-61;48,50:if(d^=0)=(x=91)then repeat p:=p+92-x;z:=z+Ord(p^=x)-Ord(p^=x xor 6);until z=0;end;Inc(p)until x=0;end.


        Here the same code, indented and commented :



        var
        d,p:PByte;
        x:Int8;
        f:File;
        z:Word=30000;
        begin
        // Allocate 30000 bytes for the program and the same amount for the data :
        p:=AllocMem(z+z);
        d:=p+z;
        // Read the file (which path must be specified on the command line) :
        Assign(F,ParamStr(1));
        Reset(F,1);
        BlockRead(F,p^,z);
        // Handle all input, terminating at #0 (better than the spec requires) :
        repeat
        // Prevent a begin+end block by preparing beforehand (values are only usable in '[' and ']' cases) :
        z:=1; // Start stack at 1
        x:=p^; // Starting at '[' or ']'
        // Choose a handler for this token (the offset saves 1 character in later use) :
        case x-43of
        1:Read(PChar(d)^); // ',' : Read 1 character from input into data-pointer
        3:Write(Char(d^)); // '.' : Write 1 character from data-pointer to output
        0,2:d^:=d^+44-x; // '+','-' : Increase or decrease data
        17,19:d:=d+x-61; // '<','>' : Increase or decrease data pointer
        48,50: // '[',']' : Start or end program block, the most complex part :
        if(d^=0)=(x=91)then // When (data = 0 and forward), or when (data <> 0 and backward)
        repeat //
        p:=p+92-x; // Step program 1 byte back or forward
        z:=z+Ord(p^=x) // Increase stack counter when at another bracket
        -Ord(p^=x xor 6); // Decrease stack counter when at the mirror char
        until z=0; // Stop when stack reaches 0
        end;
        Inc(p)
        until x=0;
        end.


        This one took me a few hours, as it's not the kind of code I normally write, but enjoy!



        Note : The prime test works, but doesn't stop at 100, because it reads #13 (CR) before #10 (LF)... do other submissions suffer this problem too when running on CRLF OSes?






        share|improve this answer











        $endgroup$














        • $begingroup$
          Wow! I never would have expected to trump C in terseness with Delphi! Not until you apply my ideas to C I guess ;-)
          $endgroup$
          – PatrickvL
          Mar 12 '11 at 16:30


















        7













        $begingroup$

        C, 260 + 23 = 283 bytes





        I created a C program which can be found here.



        main(int a,char*s[])int b[atoi(s[2])],*z=b,p;char*c=s[1],v,w;while(p=1,
        *c)q('>',++z)q('<',--z)q('+',++*z)q('-',--*z)q('.',putchar(*z))q(',',*z
        =getchar())if(*c=='['


        Has to be compiled via gcc -D"q(a,b)"="*c-a||(b);" -o pmmbf pmmbf.c and can be called as follows: pmmbf ",[.-]" 30000 whereby the first argument (quoted) contains the bf-program to run, the second determines how large the tape should be.






        share|improve this answer











        $endgroup$










        • 1




          $begingroup$
          I think that you need to add 23 characters to your count for the -D"q(a,b)"="*c-a||(b);" option, since that seems (to my limited understanding, at least) to be helping you shrink your code.
          $endgroup$
          – Gareth
          Aug 5 '11 at 9:23










        • $begingroup$
          The option is included in the posted text. The reason for it is to avoid the lengthy word define and newline, but I don't think that's really kosher. Anyway with the quotes, comment, and gcc -D I don't see the advantage at all.
          $endgroup$
          – Potatoswatter
          Aug 6 '11 at 3:30


















        5













        $begingroup$

        C, 267



        #define J break;case
        char*p,a[40000],*q=a;w(n)for(;*q-93;q++)if(n)switch(*q)J'>':++p;J'<':--p;J'+':++*p;J'-':--*p;J'.':putchar(*p);J',':*p=getchar();if(*q==91)char*r=*p&&n?q-1:0;q++;w(r);q=r?r:q;main(int n,char**v)p=a+read(open(v[1],0),a,9999);*p++=93;w(1);


        Run as ./a.out primes.bf



        Ungolfed Version:



        #define J break;case

        char*p,a[40000],*q=a; // packed so program immediately followed by data

        w(n)
        for(;*q-93;q++) // until ']'
        if(n)switch(*q) // n = flagged whether loop evaluate or skip(0)
        J'>':++p;
        J'<':--p;
        J'+':++*p;
        J'-':--*p;
        J'.':putchar(*p);
        J',':*p=getchar();

        if(*q==91)char*r=*p&&n?q-1:0;q++;w(r);q=r?r:q; // recurse on '[', record loop start



        main(int n,char**v)
        p=a+read(open(v[1],0),a,9999);
        *p++=93; // mark EOF with extra ']' and set data pointer to next
        w(1); // begin as a loop evaluate






        share|improve this answer











        $endgroup$






















          5













          $begingroup$

          Python 2, 223



          I admit that I recycled an old program of mine (but had to change it quite a bit, because the old version didn't have input, but error checking...).



          P="";i,a=0,[0]*30000
          import os,sys
          for c in open(sys.argv[1]).read():x="><+-.[,]".find(c);P+=" "*i+"i+=1 i-=1 a[i]+=1 a[i]-=1 os.write(1,chr(a[i])) while+a[i]: a[i]=ord(os.read(0,1)) 0".split()[x]+"n";i+=(x>4)*(6-x)
          exec P


          Runs the primes calculator fine.



          I see now that Alexandru has an answer that has some similarities. I'll post mny answer anyways, because I think there are some new ideas in it.






          share|improve this answer









          $endgroup$






















            4













            $begingroup$

            C, 374 368



            Reads from a file. Passes PRIME.BF test.



            Usage: ./a.out PRIME.BF



            #include <stdio.h>
            main(int c,char**v)int m[30000],s[99],p=0,i=0,n=0;char l[9999],d;FILE*f=fopen(v[1],"r");for(l[i]=0;i<9999&&l[i]!=EOF;l[i]=getc(f))i++;for(i=1;d=l[i];i++)if(!n)p+=d-62?0:1;p-=d-60?0:1;m[p]+=d-43?0:1;m[p]-=d-45?0:1;if(d==46)putchar(m[p]);if(d==44)m[p]=getchar();if(d==93)i=s[c]-1;c--;n++;if(d==91)if(m[p])c++;s[c]=i;elsen++;n-=d-93?0:1;



            Reformatted:



            #include <stdio.h>
            main(int c,char**v)
            int m[3000],s[99],p=0,i=0,n=0;
            char l[9999],d;
            FILE*f=fopen(v[1],"r");
            for(l[i]=0;i<9999&&l[i]!=EOF;l[i]=getc(f))i++;
            for(i=1;d=l[i];i++)
            if(!n) // > < + - . , ] n [ ]
            p+=d-62?0:1;
            p-=d-60?0:1;
            m[p]+=d-43?0:1;
            m[p]-=d-45?0:1;
            if(d==46)putchar(m[p]);
            if(d==44)m[p]=getchar();
            if(d==93)i=s[c]-1;c--;n++;

            if(d==91)if(m[p])c++;s[c]=i;elsen++;
            n-=d-93?0:1;







            share|improve this answer











            $endgroup$














            • $begingroup$
              3000 vs 30000. Your buffer is too small. The program size is too small also.
              $endgroup$
              – Alexandru
              Jan 31 '11 at 12:54











            • $begingroup$
              I made a typo, fixed. What do you mean by program size? If you mean max file size, you didn't specify a minimum it should handle.
              $endgroup$
              – jtjacques
              Jan 31 '11 at 15:27


















            4













            $begingroup$

            Lua, 285



            loadstring("m,p=0,1 "..io.open(arg[1]):read"*a":gsub("[^.,<>[%]+-]",""):gsub(".",["."]="io.write(string.char(@)) ",[","]="@=io.read(1):byte() ",["<"]="p=p-1 ",[">"]="p=p+1 @=@or 0 ",["["]="while @~=0 do ",["]"]="end ",["+"]="@=(@+1)%256 ",["-"]="@=(@-1)%256 "):gsub("@","m[p]"))()


            Somewhat readable version:



            loadstring( --execute
            "m,p=0,1 ".. --initialize memory and pointer
            io.open(arg[1]) --open file
            :read"*a" --read all
            :gsub("[^.,<>[%]+-]","") --strip non-brainfuck
            :gsub(".", --for each character left
            ["."]="io.write(string.char(@)) ", -- '@' is shortcut for 'm[p]', see below
            [","]="@=io.read(1):byte() ",
            ["<"]="p=p-1 ",
            [">"]="p=p+1 @=@or 0 ", --if a before unexplored memory cell, set to 0
            ["["]="while @~=0 do ",
            ["]"]="end ",
            ["+"]="@=(@+1)%256 ", --i like it overflowing
            ["-"]="@=(@-1)%256 "

            )
            :gsub("@","m[p]") --replace the '@' shortcut
            ) --loadstring returns a function
            () --call it


            Works perfectly



            Lua, 478, w/o loadstring



            local m,p,i,r,c=0,1,1,,io.open(arg[1]):read"*a"while i<=#c do(([43]=function()m[p]=(m[p]+1)%256 end,[45]=function()m[p]=(m[p]-1)%256 end,[62]=function()p=p+1 m[p]=m[p]or 0 end,[60]=function()p=p-1 end,[46]=function()io.write(string.char(m[p]))end,[44]=function()m[p]=io.read(1):byte()end,[91]=function()if m[p]==0 then i=select(2,c:find("%b[]",i))else r[#r+1]=i end end,[93]=function()if m[p]==0 then r[#r]=nil else i=r[#r] end end)[c:byte(i)]or function()end)()i=i+1 end


            Readable version:



            local m, p, i, r, c= --memory, pointer, brackets stack, code
            0, 1, 1, , io.open(arg[1]) --open file
            :read"*a" --read it
            while i<=#c do --while there's code
            (
            (

            [43]=function() -- +
            m[p]=(m[p]+1)%256
            end,
            [45]=function() -- -
            m[p]=(m[p]-1)%256
            end,
            [62]=function() -- >
            p=p+1 m[p]=m[p]or 0 --if new memory cell, set it to 0
            end,
            [60]=function() -- <
            p=p-1
            end,
            [46]=function() -- .
            io.write(string.char(m[p]))
            end,
            [44]=function() -- ,
            m[p]=io.read(1):byte()
            end,
            [91]=function() -- [
            if m[p]==0 then
            i=select(2,c:find("%b[]",i)) --find matching ]
            else
            r[#r+1]=i --push position to the stack
            end
            end,
            [93]=function() -- ]
            if m[p]==0 then
            r[#r]=nil --pop from stack
            else
            i=r[#r] --go to position on the top of stack
            end
            end

            )[c:byte(i)] --transform character into code
            or function()end --do nothing on non-brainfuck
            )() --run the resulting function
            i=i+1 --go to the next opcode
            end





            share|improve this answer









            $endgroup$






















              4













              $begingroup$

              Brainfuck, 948 bytes



              Well, that took a while. I golfed a Brainfuck self-interpreter by ... not me.



              ->->>>-[,+>+<[->-]>[->]<+<-------------------------------------[+++++++++++++++++++++++++++++++++++++>-]>[->]<<[>++++++++[-<----->]<---[-[-[-[--------------[--[>+++++++[-<---->]<-[--[[+]->]<+[->++>]->]<+[->+>]->]<+[->+++++>]->]<+[->++++++>]->]<+[->+++++++>]->]<+[->++++>]->]<+[->++++++++>]->]<+[->+++>]->]+<+[->->]>[-<->]<]>>->>-<<<<<+++[<]>[-[-[-[-[-[-[-[-<<++++++++>>>[>]>>>>+[->>+]->,<<<+[-<<+]-<<<[<]<]>[<<<+++++++>>>[>]>>>>+[->>+]->.<<<+[-<<+]-<<<[<]]<]>[<<<++++++>>>[>]>>>>+[->>+]<<-<<+[-<<+]-<<<[<]]<]>[<<<+++++>>>[>]>>>>+[->>+]+>>-<<[-<<+]-<<<[<]]<]>[<<<++++>>>[>]>>>>+[->>+]->-<<<+[-<<+]-<<<[<]]<]>[<<<+++>>>[>]>>>>+[->>+]->+<<<+[-<<+]-<<<[<]]<]>[<++[>]>>>>+[->>+]->[<<<+[-<<+]-<<<[<]-[<<-[>->-[<+]]<+[->>[<]]<-[>-->+[<++]]<++[-->>[<]]<++>>[[-<+>]<<[->>+<<]]<[>]>]]<[<<+[-<<+]-<<<[<]>--<<++>]>]<]>[<<<+>>>[>]>>>>+[->>+]->[<<<+[-<<+]-<<<[<]]<[<<+[-<<+]-<<<[<]+[>-[<-<]<<[>>]>>-[<+<]<<[>>]>>++<[>[-<<+>>]<[->+<]]<[>]>]]>[[-<<+>>]<[->+<]>]]>]





              share|improve this answer









              $endgroup$






















                4













                $begingroup$


                Recall, 594 bytes



                In short: Recall has no arithmetic operators in a classic sense, it only has bitwise operations. You can not just "add one" etc. Recall is also strictly stack-based.



                DC505M22022M32032M606M42042M707M92092M4405022o032o06o042o07o092o044o1305022o06o042o092o52052q.q2305022o06o07o93093q.q5403206o07o14014q.q6403206o042o07o24024q.q74Yx34034z03MMMMMMMM034o3yY030401r3.4.101zyY040301r4.3.101zY01052gZ02Z040301052023s4.3.10zyY01023gZ02z030401023052s3.4.10zyY01093gZ02q20zyY01054gZ02u20zyY01014gZx20zyY01064gZ02X0zyY01024gZ03304302r33.43.20zyY01074gZ04303302r43.33.20zyyQ6205.8Y06208g6206208iZ08M808013izy062U7205.9Y07209g7207209iz09M909013izy072R53.63.82063MMMMMMMM053o63082013i53082KKKKKKKK82053063082S84.94.12.73.83t012073083TY083073012r83.73.12012084gzY012094gZt0zyy



                Example 1: Print something



                Input:



                -[--->+<]>-----..-[----->+<]>.++++.+[->++++<]>.---[----->++<]>.---.------------.++++++++.++++++++.+[-->+++++<]>-.


                Output:



                PPCG rocks!



                Example 2: Output square numbers up to 100



                Input:



                +[>++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]


                Output:



                0
                1
                4
                9
                16
                25
                36
                49
                64
                81
                100


                This example might take a few minuted to execute and might cause a "this tab is frozen" message. Ignore that and wait.






                share|improve this answer











                $endgroup$










                • 4




                  $begingroup$
                  Your website domain has expired. Also, this answer is non-competing, because the language is newer than the challenge.
                  $endgroup$
                  – mbomb007
                  Mar 23 '16 at 20:27



















                3













                $begingroup$

                OCaml(lex), 497 chars



                OCamllex is part of the standard distribution of OCaml.



                let a=Array.create 30000 0
                let(%)f g h=f(g h)
                let s v i=a.(i)<-v;i
                let o d i=s(a.(i)+d)i
                let p i=print_char(Char.chr a.(i));flush stdout;i
                let r i=s(Char.code(input_char stdin))i
                let rec w g i=if 0=a.(i)then i else w g(g i)
                let n x=x
                rule t f=parse
                |'>'t(succ%f)lexbuf
                |'<'t(pred%f)lexbuf
                |'+'t((o 1)%f)lexbuf
                |'-'t((o(-1))%f)lexbuf
                |'.'t(p%f)lexbuf
                |','t(r%f)lexbuf
                |'['t((w(t n lexbuf))%f)lexbuf
                |']'|eoff
                |_t f lexbuf
                let _=t n(Lexing.from_channel(open_in Sys.argv.(1)))0


                Save as b.mll and run with



                ocamllex b.mll && ocaml b.ml prime.bf


                I don't like parsing by hand, so I used the provided lexer generator. From the tokens read, we compose a function for the whole brainf*ck program.






                share|improve this answer











                $endgroup$






















                  3













                  $begingroup$

                  C# (2861 char, ~84 lines)



                  This is not the prettiest solution to the problem, and probably not all that 'Golf-ish', since I wasn't as concerned with length as I probably should have been. (I didn't remove the comments or extra white space.) I just wanted to try something in a new language, to see if I could. If I did it again, I'd drop the use of the stack for returning from ']' and just look back. Run without command line arguments it runs the hello world program given in the problem description. It accepts one command line argument, the filename of the program to run.



                  using System;
                  using System.Collections.Generic;

                  namespace ConsoleApplication1

                  class Program

                  static void Main(string[] args)

                  String ProgSource;
                  if (args.Length > 0)
                  ProgSource = System.IO.File.ReadAllText(args[0]);
                  else //hello world
                  ProgSource = "";

                  Stack<int> stack = new Stack<int>();
                  char[] bfProg = ProgSource.ToCharArray();
                  char[] mem = new char[30000];
                  int ptr = 0;

                  for (int ip = 0; ip<bfProg.Length; ip++)
                  switch (bfProg[ip])

                  case ('>'): ptr++; break;
                  case ('<'): ptr--; break;
                  case ('+'): mem[ptr]++; break;
                  case ('-'): mem[ptr]--; break;
                  case ('.'): Console.Write(mem[ptr]); break;
                  case (','):
                  char key = Console.ReadKey(false).KeyChar;
                  if (key == 'r')

                  key = (char)10;
                  Console.WriteLine();

                  mem[ptr] = key;
                  break;
                  case ('['):
                  if (mem[ptr] == 0)

                  int openBraces = 1;
                  //find the closing brace for this expression
                  for (int x = 1; x < (bfProg.Length - ip); x++)

                  if (bfProg[ip + x] == ']') openBraces--;
                  if (bfProg[ip + x] == '[') openBraces++;
                  if (openBraces == 0)

                  if (stack.Peek() == ip) stack.Pop();
                  ip += x;
                  break;



                  else

                  stack.Push(ip);

                  break;
                  case (']'):
                  if (mem[ptr] == 0)
                  stack.Pop();
                  else

                  ip = stack.Peek();

                  break;



                  Console.WriteLine("nnnExecution Completed Sucessfully. Press any key to continue...");
                  Console.ReadKey();







                  Edit: Removed unused references.






                  share|improve this answer











                  $endgroup$










                  • 1




                    $begingroup$
                    @mbomb007 - Updated. Completely forgot I even did this one. (Didn't even realize anyone even read these old questions)
                    $endgroup$
                    – theB
                    Aug 31 '15 at 21:18










                  • $begingroup$
                    Not only do people still read them, they still answer and golf them.
                    $endgroup$
                    – mbomb007
                    Nov 15 '16 at 17:08


















                  3













                  $begingroup$


                  C (gcc), 273 268 bytes





                  main(_,a)_=fopen("w.c","w");fputs("main()char a[30000],*p=a;",_);x:a=getchar();fputs(a-62?a-60?a-43?a-45?a-46?a-44?a-91?a-93?~a?"":"":"":"while(*p)":"*p=getchar();":"putchar(*p);":"--*p;":"++*p;":"--p;":"++p;",_);if(~a)goto x;fclose(_);system("cc w.c;./a.out");;


                  Try it online!



                  -5 thanks to ceilingcat



                  Takes input from stdin.



                  This relies a little bit on the environment, but is pretty consistent. This is effectively the eval solution for c. It writes an appropriate C program to the file w.c, compiles it, and runs it as the desired executable. Thus as a bonus effect this actually compiles the bf code and leaves a.out as a binary for it. Note that depending on the system you may need to modify the last string. In particular most windows c compilers call the default executable "a.exe". Luckily as far as I can tell, they all have the same length so the bytecount is the same. (though if you don't have a cc defined you may need to add a letter such as gcc to the compile command, adding 1 byte).



                  I am aware that this thread is a bit old, but I didn't see this style of C solution yet, so I thought I'd add it.






                  share|improve this answer











                  $endgroup$














                  • $begingroup$
                    259 bytes
                    $endgroup$
                    – ceilingcat
                    Aug 4 at 16:37


















                  3













                  $begingroup$


                  C (gcc) Linux x86_64, 884 621 525 487 439 383 372 bytes





                  *mmap();d[7500];(*p)();*j(a,g,q)char*a;char*t=a,*n,*c;for(q=0;read(g,&c,c=!q);)t=c==91?n=j(t+9,g),c=n-t-9,bcopy(&c,mempcpy(t,"x80>xfx84",5),4),n:c==93?a-=14+t,q=*t=233,mempcpy(t+1,&a,4):stpcpy(t,c-62?c-60?c-43?c-45?c-46?c-44?"":"1xc0P_xF5":"RXR_xF5":L"໾":L"۾":L"컿":L"웿");return t;main(P,g)int**g;p=mmap(0,1<<20,6,34,0,0);p(*j(p,open(g[1],0))=195,d,1);


                  Try it online!



                  This is a JIT that compiles BF code into x86_64 machine language at runtime. This performs a straight translation so commonly occurring sequences such as >>>, <<<, +++ and --- aren't coalesced into faster instructions.



                  Less golfed version:



                  // size of data area
                  *mmap();d[7500];(*p)();
                  // recursive function translates BF commands to x86_64 instructions
                  *j(a,g,q)char*a;
                  char*t=a,*n,*c;
                  for(q=0;read(g,&c,c=!q);)
                  t=c==91? // [
                  // cmpb $0x0,(%rsi)
                  // je N
                  n=j(t+9,g),c=n-t-9,bcopy(&c,mempcpy(t,"x80>xfx84",5),4),n
                  :
                  c==93? // ]
                  // jmp a
                  a-=14+t,q=*t=233,mempcpy(t+1,&a,4)
                  :
                  stpcpy(t,c-62? // >
                  c-60? // <
                  c-43? // +
                  c-45? // -
                  c-46? // .
                  c-44? // ,
                  ""
                  :
                  // xor %eax,%eax
                  // push %rax
                  // pop %rdi
                  // syscall
                  "1xc0P_xF5"
                  :
                  // push %rdx
                  // pop %rax
                  // push %rdx
                  // pop %rdi
                  // syscall
                  "RXR_xF5"
                  :
                  // decb (%rsi)
                  L"໾"
                  :
                  // incb (%rsi)
                  L"۾"
                  :
                  // dec %esi
                  L"컿"
                  :
                  // inc %esi
                  L"웿");
                  return t;

                  main(P,g)int**g;
                  // allocate text (executable) memory and mark as executable
                  p=mmap(0,1<<20,6,34,0,0);
                  // run JIT, set %rdx=1 and call code like a function
                  p(*j(p,open(g[1],0))=195,d,1);






                  share|improve this answer











                  $endgroup$






















                    2













                    $begingroup$

                    [EDIT]



                    C++11, 355, reads from file:



                    #include<functional>
                    #include<stdio.h>
                    main()
                    char b[30000],g[9999],*f=g,*p=b,n[]="+-,.><[]",j;
                    std::function<void()>m[]=
                    [&p](*p)++;,
                    [&p](*p)--;,
                    [&p]*p=getchar();,
                    [&p]putchar(*p);,
                    [&p]p++;,
                    [&p]p--;,
                    [&p,&f]if(!(*p))while(*f-93)f++;,
                    [&f,&m]while(*f-91)f--;m[6]();
                    ;
                    fread(g,1,9999,fopen(a[1],0));
                    for(;*f;f++)for(j=0;n[j];j++)if(n[j]==*f)m[j]();



                    Test



                    http://ideone.com/b7vO4



                    [OLD VERSION]



                    C++11, 391, to see running: http://ideone.com/yZHVv



                    #include<functional>
                    #include<stdio.h>
                    main(int c,char **a) c==']'))m[c]();






                    share|improve this answer











                    $endgroup$


















                      1 2
                      next






                      Your Answer






                      StackExchange.ifUsing("editor", function ()
                      StackExchange.using("externalEditor", function ()
                      StackExchange.using("snippets", function ()
                      StackExchange.snippets.init();
                      );
                      );
                      , "code-snippets");

                      StackExchange.ready(function()
                      var channelOptions =
                      tags: "".split(" "),
                      id: "200"
                      ;
                      initTagRenderer("".split(" "), "".split(" "), channelOptions);

                      StackExchange.using("externalEditor", function()
                      // Have to fire editor after snippets, if snippets enabled
                      if (StackExchange.settings.snippets.snippetsEnabled)
                      StackExchange.using("snippets", function()
                      createEditor();
                      );

                      else
                      createEditor();

                      );

                      function createEditor()
                      StackExchange.prepareEditor(
                      heartbeatType: 'answer',
                      autoActivateHeartbeat: false,
                      convertImagesToLinks: false,
                      noModals: true,
                      showLowRepImageUploadWarning: true,
                      reputationToPostImages: null,
                      bindNavPrevention: true,
                      postfix: "",
                      imageUploader:
                      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                      allowUrls: true
                      ,
                      onDemand: true,
                      discardSelector: ".discard-answer"
                      ,immediatelyShowMarkdownHelp:true
                      );



                      );













                      draft saved

                      draft discarded


















                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f84%2finterpret-brainf%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown


















                      By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy








                      Not the answer you're looking for? Browse other questions tagged code-golf interpreter brainfuck or ask your own question.






                      StackExchange.ready(function()$.get('/posts/84/ivc/8511'););










                      StackExchange.ready(function () StackExchange.responsiveness.addSwitcher(); )
                      Code Golf Stack Exchange works best with JavaScript enabled




                      (function(i, s, o, g, r, a, m) function() []).push(arguments) , i[r].l = 1 * new Date(); a = s.createElement(o),
                      m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m);
                      )(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');

                      StackExchange.ready(function () code-golf);

                      /**/

                      var _qevents = _qevents || [],
                      _comscore = _comscore || [];
                      (function()
                      var ssl = 'https:' == document.location.protocol,
                      s = document.getElementsByTagName('script')[0],
                      qc = document.createElement('script');
                      qc.async = true;
                      qc.src = (ssl ? 'https://secure' : 'http://edge') + '.quantserve.com/quant.js';
                      s.parentNode.insertBefore(qc, s);
                      _qevents.push( qacct: "p-c1rF4kxgLUzNc" );
                      /**/
                      var sc = document.createElement('script');
                      sc.async = true;
                      sc.src = (ssl ? 'https://sb' : 'http://b') + '.scorecardresearch.com/beacon.js';
                      s.parentNode.insertBefore(sc, s);
                      _comscore.push( c1: "2", c2: "17440561" );
                      )();


                      Popular posts from this blog

                      Sahara Skak | Bilen | Luke uk diar | NawigatsjuunCommonskategorii: SaharaWikivoyage raisfeerer: Sahara26° N, 13° O

                      The fall designs the understood secretary. Looking glass Science Shock Discovery Hot Everybody Loves Raymond Smile 곳 서비스 성실하다 Defas Kaloolon Definition: To combine or impregnate with sulphur or any of its compounds as to sulphurize caoutchouc in vulcanizing Flame colored Reason Useful Thin Help 갖다 유명하다 낙엽 장례식 Country Iron Definition: A fencer a gladiator one who exhibits his skill in the use of the sword Definition: The American black throated bunting Spiza Americana Nostalgic Needy Method to my madness 시키다 평가되다 전부 소설가 우아하다 Argument Tin Feeling Representative Gym Music Gaur Chicken 일쑤 코치 편 학생증 The harbor values the sugar. Vasagle Yammoe Enstatite Definition: Capable of being limited Road Neighborly Five Refer Built Kangaroo 비비다 Degree Release Bargain Horse 하루 형님 유교 석 동부 괴롭히다 경제력

                      19. јануар Садржај Догађаји Рођења Смрти Празници и дани сећања Види још Референце Мени за навигацијуу