Руководство по Brainfuck для новичков [5] (16.08.2014)
К началу

6 Простые конструкции

6.1 Поиск нуля

Алгоритм нахождения первой нулевой ячейки справа от текущей:
[>]
6.1.1 Описание

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

6.1.2 Поиск других значений

Аналогично можно искать что-либо еще:

1: -[+>-]+
2: --[++>--]++

6.1.2.1 Описание
До начала цикла мы уменьшаем значение текущей ячейки на искомое число. Если мы достигли нуля, считаем, что нашли необходимую ячейку, цикл пропускается и мы восстанавливаем значение текущей ячейки. Иначе, уже в цикле, восстанавливаем значение, продвигаемся вправо, уменьшаем значение и т.д.
Подобной конструкцией очень легко запустить бесконечный цикл, если искомого значения в памяти не найдется.

6.2  Перемещение содержимого одной ячейки в другую

Поскольку ячейки памяти в Brainfuck имеют непосредственное влияние на алгоритм, перемещение значения в другую ячейку может оказаться полезным. Так можно просто размножить значение, получить сумму текущей ячейки и соседней, а также управлять поведением цикла [ ].
Следующая программа переместит значение текущей ячейки в последующую:
++>+++<    (2)3
[->+<]>    0(5)
1. Вычтем единицу из значения первой ячейки
2. Переместимся ко второй
3. Добавим единицу
4. Вернемся к первой ячейке
Цикл будет продолжаться, пока значение первой ячейки не станет нулем.
Путем небольших изменений можно изменить направление переноса или разнести значение по нескольким ячейкам.

6.3  Сложение

Описанный выше процесс перемещения деструктивен, поскольку он обнуляет значение первой ячейки. Чтобы его восстановить, сохраним даное значение во временной ячейке памяти, а затем разнесем его по первым двум.
Следующая программа добавит значение текущей ячейки к последующей, используя третью ячейку для временного хранения:
++>+++<      (2)3
[->>+<<]       (0)32
>>[-<+<+>>]<     2(5)0
Сперва переместим значение первой ячейки в третью. Затем значение третьей ячейки в первую и вторую.

6.4 Копирование

Копирование значения одной ячейки в другую можно разложить на две операции - очистку целевой ячейки, присвоение ей значения исходной ячейки:
++>+++<         (2)3
>[-]               2(0)
<[->+>+<<]         (0)22
>>[-<<+>>]<        2(2)
6.5 Вычитание

Вычитание, как можно было предположить, от сложения отличается только знаком:
[->>+<<]>>[-<-<+>>]
6.6 Умножение

Умножение - это повторяющееся сложение, а значит, можно воспользоваться приобретенным опытом. Поскольку первый множитель будет уменьшаться при каждом проходе, необходимо сохранить его значение во временной ячейке.
Умножим число 2 в ячейке #0 на 3 в ячейке #1 (пример взят отсюда)
          I проход  II проход
++>+++<      (2)3    
[>        2(3)    1(3)3
[>+>+<<-]      2(0)33  1(0)63
>>[<<+>>-]    233(0)  136(0)
<<<-]        (1)33    (0)36
>>            03(6)

Далее - Условный переход
Brainfuck
comments powered by Disqus
JavaScript (13)
PHP (11)
Brainfuck (8)
adm (8)
Joomla (4)
Canvas (3)
answers (2)
API (2)
CMS (2)
Modx (2)
jQuery (1)
Ajax (1)
SQL (1)
Shell (1)
batch (1)
10-6