Привет, Брейнфак!

Brainfuck — тьюринг-полный язык, то есть на нем можно написать любую программу, которую можно написать :) А мы напишем «Hello World», а точнее несколько ;) Введение Brainfuck состоит всего из 8 команд:

  • > - перейти к следующей ячейке памяти
  • < - move to the previous memory cell
  • + - увеличить значение в текущей ячейке памяти
  • — — уменьшение значения в текущей ячейке памяти
  • [ — если значение текущей ячейки равно нулю, переход по тексту программы вперед на ячейку, следующую за соответствующей ] (с учетом вложенности)
  • ] - если значение текущей ячейки не равно нулю, вернуться по тексту программы к ячейке, следующей за соответствующим [ (с учетом вложенности)
  • .

    — отображение значения текущей ячейки

  • , — введите значение и сохраните его в текущей ячейке
Переводчики Для выполнения программ, написанных на Brainfuck, вы можете использовать: Привет, Мозгобой! Давайте напишем нашу первую программу Brainfuck, которая будет печатать текст «Hello World!» Алгоритм прост: 1. Увеличивайте значение в ячейке до тех пор, пока оно не станет равным нужному символу.

2. Выводим значение в ячейке (наш символ) 3. Перейти к следующей ячейке 4. Повторяйте, пока не отобразятся все символы.

Результат:

+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++.

> +++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++.

> ++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++.

> ++++++ +++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++.

> ++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++.

> ++++++++++++++++++++++++++++ +++++.

> ++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++.

> +++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++.

> +++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++ .

> ++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++.

> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++.

> +++++++++++++++++++++++++++++++ ++++.

Реализуем алгоритм на PHP — скрипт сгенерирует исходный код в Brainfuck, в котором отобразится необходимый текст:
$text = «Привет, мир!»; $длина = стрлен($текст); для ($i=0;$i<$length;$i++){ $curr = ord($text[$i]); для ($j=1;$j<=$curr;$j++){ эхо «+»; if ($j == $curr & $i != $length-1){ эхо ".

> "; }elseif ($j == $curr){ эхо ".

"; } }

"Привет, мир!" получился довольно большим по размеру, попробуем его оптимизировать.

Не обязательно каждый раз переходить на новую ячейку и начинать «путь» к нужному символу с нуля – мы можем использовать текущее значение ячейки.

Новый алгоритм: 1. Увеличивайте значение в ячейке до тех пор, пока оно не станет равным нужному символу.

2. Выводим значение в ячейке (наш символ) 3. Если следующий требуемый символ больше текущего, то увеличьте значение в ячейке; если меньше, уменьшаем, пока не получим желаемое 4. Выводим значение в ячейке (наш символ) 5. Повторяйте, начиная с шага 3, пока не будут выведены все символы.

Результат:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.

++++++++ +++++++++++++++++++++.

+++++++.

+++.

---------------------------------------------- ---------------------------------.

+++++++++++++++++++++++++++++++++++++++++++++++ ++++++++.

++++++++++++++++++++++++.

+++.

------.

--------.

--------------------------- ----------------------------------------.

Уже меньше :) Вот php-код, генерирующий аналогичный исходник:
$text = «Привет, мир!»; $длина = стрлен($текст); $курр = 0; для ($i=0;$i<$length;$i++){ $delta = ord($text[$i])-$curr; $curr = ord($text[$i]); если ($дельта<0){ $оп = "-"; $дельта = абс($дельта); }еще{ $оп = "+"; } для ($j=1;$j<=$delta;$j++){ эхо $оп; } эхо ".

"; }

Можно ли дополнительно оптимизировать полученный код на Brainfuck? Может! Теперь мы снова будем использовать несколько ячеек, но реализуем и будем использовать умножение.

А помогут в этом неиспользуемые ранее команды [ и ].

Умножение – с использованием суммы 5*10=10+10+10+10+10. То есть нам нужно повторить прибавление 10 к ячейке 5 раз.

Алгоритм программы: 1. Увеличить значение в ячейке до тех пор, пока оно не станет равным 10 - счетчик цикла, множитель 2. Цикл начинается [ 3. Увеличивайте значение в ячейке до тех пор, пока оно не станет равным n – результату целочисленного деления кода искомого символа на 10. 4. Перейти к следующей ячейке 5. Повторите шаги 3–4 для всех символов.

6. Уменьшить счетчик циклов (первая ячейка) 7. Цикл окончен] 8. Переход к следующей ячейке после счетчика 9. Добавляем в ячейку остаток от целочисленного деления кода нужного символа на 10 (для «Н» в ячейке у нас будет 70, нужно прибавить 2 = 72% 10. То есть в итоге получаем «Н» = (72/10)+(72)) 11. Выводим значение в ячейке (наш символ) и переходим к следующей ячейке 12. Повторите шаги 9–11 для всех символов.

Результат:

+++++++++[> ++++++++> ++++++++++> ++++++++++> ++++++++ +> +++++++++++> ++++> ++++++++> +++ +++++++> ++++++++++++> ++++++++++> ++++++++++> +++<<<< <<<<<<<< — ]> ++.

> +.

> ++++++++.

> ++++++++.

> +.

> ++.

> +++++ ++.

> +.

> ++++.

> ++++++++.

> .

> +++.

Вуаля! Код генератора PHP:
$text = «Привет, мир!»; $длина = стрлен($текст); эхо "++++++++++["; для ($i=0;$i<$length;$i++){ эхо "> "; $ops = Floor(ord($text[$i])/10); для ($j=1;$j<=$ops;$j++){ эхо «+»; } } для ($i=0;$i<$length;$i++){ эхо"<"; } эхо "-]"; для ($i=0;$i<$length;$i++){ эхо "> "; $ops = ord($text[$i]) % 10; для ($j=1;$j<=$ops;$j++){ эхо «+»; } эхо ".

"; }

Нижняя граница Вот такой интересный и замечательный язык Brainfuck :) В заключение приведу генератор, который я написал на самом Brainfuck. Эта программа считывает введенный текст и генерирует код Brainfuck (оптимизированный), который будет выводить этот текст.
> > > > > > > > ++++++++++++++++++++++++++++++++++++++++++++ +> +++++++++++++++++++++++++++++++++++++++++++++++> ++++ ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++> ++++++++++++++++ ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++> ++++++++++++++++++++++++++++ ++ +++++++++++++++++++++++++++++++++> +++++++++++++++ ++ +++++++++++++++++++++++++++++++++++++++++++++> ++++++ ++ +++++++++++++++++++++++++++++++++++++++++<<<<<<<<<<<< << ,---------[++++++++++> > > > > > > > .

> > .

> > .

<<<< << <<<<[-]++++++++++<<[> +> > > > +<<<<<-]> > > > > [<<<<<+> > > > > - ]<<<<> > [-]> [-]<<[> > +> +<<<-]> > > [<<<+> > > -]> > [-]<<<<< <[ > > > > +> > +<<<<<<-]> > > > > > [<<<<<<+> > > > > > -]<<<[> > +> +<<< -] > > > [<<<+> > > -][-]<<[> > [-]<[> [-]+<[-]]<[-]]> [-]> [<<< << <-> > > -> > > [-]<<<<<<[> > > > +> > +<<<<<<-]> > > > > > [<<<<<<+> > > > > > -]<<<[> > +> +<<<-]> > > [<<<+> > > -][-]<<[> > [-]<[> [-]+ <[ -]]<[-]]> [-]> ]<<<<<<[> > +<[> > +> +<<<-]> > > [<<<+> > > -]> > [ -]<<<<<<[> > > > +> > +<<<<<<-]> > > > > > [<<<<<<+> > > > > > -]<<< [> > +> +<<<-]> > > [<<<+> > > -][-]<<[> > [-]<[> [-]+<[-]]<[-]]> [ -]> [<<<<<<-> > > -> > > [-]<<<<<<[> > > > +> > +<<<<<<-]> > > > > > [< <<<<<+> > > > > -]<<<[> > +> +<<<-]> > > [<<<+> > > -][-]<<[> > [ -] <[> [-]+<[-]]<[-]]][-]> ]<<<<<<]> > > [> +> +<<-]> > [<<+> > -] [-]+<[> [-]<<[<<-> > -]<<[> > +<<-]> > > [-]]][<<<+<[-]> > > > [ -]]<<<[-> > > > > .

<<<<<]> > > > > > > > > > .

<<<<.

> > .

> .

<<<<<<<[ -> > > > .

<<<<]> > > > > > > > > > .

<<<<.

<.

> > .

> > .

<<<<<<<<<<<<<,--- -- -----]

Теги: #brainfuck #php #hello world #Чулан
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.