Ну что же, наверное заключительная статья
по замечательному языку программирования с
задорным именем 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, второй если не
равен. Это первый пример, в котором исходное
значение не "разрушается". Можно все
сделать гораздо проще, но при этом потерять
введенное число, получив только результат
сравнения.