Ну что же, наверное заключительная статья
по замечательному языку программирования с
задорным именем BrainFuck. Напомню, что
операторов в нем всего восемь:

> = увеличение указателя памяти или
смещение право на 1 блок
< = уменьшение или смещение влево на 1 блок
+ = увеличение значения в ячейке памяти, на
которую ссылается указатель
— = соответственно уменьшение на единиц
[ = аналог цикла while(cur_block_value != 0)
] = если значение в ячейке на которую
указывает указатель не равно нулю, то
переход на [
, = аналог getchar(), ввод одного символа
. = аналог putchar(), вывод одного символа на
консоль

В прошлых статьях мы прошлись по вводу и
выводу, рассмотрели разные особенности
языка. Однако как же реализовать условия?
Допустим, мы хотим ввести с клавиатуры код символа
(x) в первый блок памяти, определить
равен ли он 5 и если равен установить другое значение
памяти (y) в 3. На С все это выглядит
просто:

x=getchar;
if(x == 5)
{
y = 3;

В реальном BrainFuck это всего лишь такая
программа:

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

Рассмотрим что же происходит в программе:

, — ввод символа в первую ячейку памяти

[>>+>+<<<-]>>>[<<<+>>>-] —
копирование из ячейки 1 в ячейку 3 используя
4 как временный буфер. Указатель остается на
4 ячейке.

Память на момент завершения выглядит так:

>+<< - запись 1 в 5 ячейку и возврат к 3.

Самая важная часть:

[——[>]>>[<<<+++>>>[-]] — вычитаем из
значения 5 и если оно именно таким и было
пишем во вторую 3, возвращаемся к 5 ячейке и
записываем туда 0 и в  результате цикл
будет работать всего один раз. Если
исходное введенное значение не равно 5,
указатель останавливается на ячейке 6.
Соответственно, память у нас может остаться
такой:

Первый вариант если х=5, второй если не
равен. Это первый пример, в котором исходное
значение не «разрушается». Можно все
сделать гораздо проще, но при этом потерять
введенное число, получив только результат
сравнения.

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

Надеюсь вы разберетесь с нею сами :).

А теперь о программах для работы:

Удачи 🙂

Оставить мнение

Check Also

Безопасность смарт-контрактов. Топ-10 уязвимостей децентрализованных приложений на примере спецификации DASP

Количество смарт-контрактов в блокчейне Ethereum только за первую половину 2018 года вырос…