Создание оператора 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>->]<<