Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Making an if(x==y) statement in Brainfuck

So I'm working on a program that reads in a file and then outputs it back out again but i'm having trouble getting the program to stop taking input at the end of the file. I want it to stop at a specific character like '0' or '$' or anything really since a one character NULL can't be read into my brainf interpreter. Here is the code so far:

>+[>,][<.]

The problem starts at [>,] since the input can never be NULL this loop never ends.

So how can I insert an if statement that will terminate this loop if it ever reaches a pre-specified end character?

like image 572
smithy545 Avatar asked Jul 21 '14 03:07

smithy545


1 Answers

The following code is equivalent to your code, except it will stop when the value of the input is 1 (non-printable in ASCII). The < between the loops is required because the last value is 0.

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

It decrements the value after input, checks if it is 0, and loops back if it isn't. If it looped back, it must increment the pointer again to undo the decrement. A sample array might be:

00  02  H  e  l  l  o  _  W  o  r  l  d  00
                                          ^

However, the [<.] prints the reverse of the string (followed by a non-printable 1). The string itself can be printed by moving the pointer to the beginning and moving forward from there, as shown in this code:

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

In this code, the [<] stops when it reaches index 0, the >> moves to index 2 (string start), and the [.>] outputs characters until it reaches the 0 at the end.

If you want to use a different ASCII character, such as space (32), repeat the + and - within the first loop that many times. (Warning: this code will result in values below 0 if there are any characters less than 32 in your input).

>+[++++++++++++++++++++++++++++++++>,--------------------------------]<[<]>>[.>]
like image 90
McLovin Avatar answered Oct 25 '22 02:10

McLovin