Brainfuck — тьюринг-полный язык, то есть на нем можно написать любую программу, которую можно написать :) А мы напишем «Hello World», а точнее несколько ;) Введение Brainfuck состоит всего из 8 команд:
- > - перейти к следующей ячейке памяти
- < - move to the previous memory cell
- + - увеличить значение в текущей ячейке памяти
- — — уменьшение значения в текущей ячейке памяти
- [ — если значение текущей ячейки равно нулю, переход по тексту программы вперед на ячейку, следующую за соответствующей ] (с учетом вложенности)
- ] - если значение текущей ячейки не равно нулю, вернуться по тексту программы к ячейке, следующей за соответствующим [ (с учетом вложенности)
- .
— отображение значения текущей ячейки
- , — введите значение и сохраните его в текущей ячейке
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 #Чулан> > .
> > .
<<<< << <<<<[-]++++++++++<<[> +> > > > +<<<<<-]> > > > > [<<<<<+> > > > > - ]<<<<> > [-]> [-]<<[> > +> +<<<-]> > > [<<<+> > > -]> > [-]<<<<< <[ > > > > +> > +<<<<<<-]> > > > > > [<<<<<<+> > > > > > -]<<<[> > +> +<<< -] > > > [<<<+> > > -][-]<<[> > [-]<[> [-]+<[-]]<[-]]> [-]> [<<< << <-> > > -> > > [-]<<<<<<[> > > > +> > +<<<<<<-]> > > > > > [<<<<<<+> > > > > > -]<<<[> > +> +<<<-]> > > [<<<+> > > -][-]<<[> > [-]<[> [-]+ <[ -]]<[-]]> [-]> ]<<<<<<[> > +<[> > +> +<<<-]> > > [<<<+> > > -]> > [ -]<<<<<<[> > > > +> > +<<<<<<-]> > > > > > [<<<<<<+> > > > > > -]<<< [> > +> +<<<-]> > > [<<<+> > > -][-]<<[> > [-]<[> [-]+<[-]]<[-]]> [ -]> [<<<<<<-> > > -> > > [-]<<<<<<[> > > > +> > +<<<<<<-]> > > > > > [< <<<<<+> > > > > -]<<<[> > +> +<<<-]> > > [<<<+> > > -][-]<<[> > [ -] <[> [-]+<[-]]<[-]]][-]> ]<<<<<<]> > > [> +> +<<-]> > [<<+> > -] [-]+<[> [-]<<[<<-> > -]<<[> > +<<-]> > > [-]]][<<<+<[-]> > > > [ -]]<<<[-> > > > > .
<<<<<]> > > > > > > > > > .
<<<<.
> > .
> .
<<<<<<<[ -> > > > .
<<<<]> > > > > > > > > > .
<<<<.
<.
> > .
> > .
<<<<<<<<<<<<<,--- -- -----]
-
Устройство Cpython. Отчет Яндекса
19 Oct, 24 -
Субстики №139
19 Oct, 24 -
Список Дел В Одном Файле Для Iphone
19 Oct, 24