Подписка
Е-Mail:
Подписаться
Отказаться





 
Кодинг          [ Безопасность ]


Версия для печати
Автор: -=Jul=-
Отправить статью по e-mail Дата: 06.03.2005 ©
Настоящий Brainfuck №3

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

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

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

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

Удачи :)





 
Найти: 





Новинки

Голосование


Яндекс цитирования