Создание оператора if (x==y) в Brainfuck

поэтому я работаю над программой, которая читает файл, а затем выводит его обратно, но у меня возникли проблемы с тем, чтобы программа перестала принимать ввод в конце файла. Я хочу, чтобы он остановился на определенном символе, таком как " 0 "или"$", или что-нибудь действительно, так как один символ NULL не может быть прочитан в моем интерпретаторе brainf. Вот код до сих пор:

>+[>,][<.]

проблема начинается с [>,] поскольку вход никогда не может быть нулевым, этот цикл никогда не заканчивается.

Так как я могу вставьте оператор if, который завершит этот цикл, если он когда-либо достигнет заданного конечного символа?

3 ответов


следующий код эквивалентен вашему коду, за исключением того, что он остановится, когда значение ввода равно 1 (непечатаемый в ASCII). В

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

он уменьшает значение после ввода, проверяет, является ли оно 0, и возвращается назад, если это не так. Если он вернулся назад, он должен снова увеличить указатель, чтобы отменить декремент. Пример массива может быть:

00  02  H  e  l  l  o  _  W  o  r  l  d  00
                                          ^
на [<.] печать обратной стороны строки (следуют непечатные 1). Сама строка может быть напечатана путем перемещения указателя в начало и перемещения вперед оттуда, как показано в этом коде:
>+[+>,-]<[<]>>[.>]

в этом коде [<] останавливается, когда он достигает индекса 0, то >> перемещается в индекс 2 (начало строки) и [.>] выводит символы, пока не достигнет 0 в конце.

если вы хотите использовать другой символ ASCII, например пробел (32), повторите + и - в первом цикле, что многие раз. (Предупреждение: этот код приведет к значениям ниже 0, если на Вашем входе есть символы меньше 32).

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

начать с важного персонажа – пойдем $, так как это ASCII 36:

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

чтение ввода, копирование как ввода, так и значимого символа в два раза, со вторым значимым символом в конце:

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

для такой структуры:

┌───┲━━━━━━━┱───────┬───────┬───┐
│ $ ┃ blank ┃ input │ input │ $ │
└───┺━━━━━━━┹───────┴───────┴───┘

вычесть первый $ С самого начала input:

<[->>-<<]>>

если это не ноль, переместите вперед три раза в пустую ячейку после копии $, затем безоговорочно переместитесь назад, выйдя из цикла, когда вход был $ и в противном случае оставить вас на $, готовы начать снова:

[>>>]<]

после цикла, вы остаетесь на blank соответствующего символа. Переместитесь вперед к соответствующему символу ввода и удалите его, чтобы он не был перепечатан, переместитесь назад пять раз, чтобы достичь предпоследнего inputнеповрежденная копия и продолжайте резервное копирование оттуда (это не должно полагаться на интерпретаторы упаковки и такое, если вы немного сдвинетесь вперед в начале):

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

а затем распечатать их!

>>>>>[.>>>>>]

в целом,

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

это полезная страница, полная алгоритмы BF что мне нравится использовать.

алгоритмы вы нужны #19 (x = x==y) и #28 (if (x) {code}) или № 30 (if (x) {code1} else {code2}).

проверить, равны ли две ячейки, довольно легко, поэтому я просто скопирую здесь. temp0 переместить в ячейку для использования в качестве временной переменной. Этот конкретный код требует, чтобы temp0 и temp1 соблюдать x последовательно память.

temp0[-]+
temp1[-]
x[
 code1
 x>-]>
[<
 code2
 x>->]<<