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

5.2 Hello World

Из множества книг по языкам программирования вам хорошо известна программа “Hello World”. Как правило, это простейшая программа, производящая видимый результат - вывод символов на экран. Однако, для Brainfuck это задача не из легких, т.к. для вывода каждого символа мы должны присвоить его ASCII-код текущей ячейке используя только имеющиеся операторы.
В отступление от текста, реализуем задачу в простейшем виде, используя единственную ячейку памяти, меняя ее значение и выводя результат:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++. (ASCII 72 ‘H’)
+++++++++++++++++++++++++++++. (ASCII 101 ‘e’)
+++++++.. (ASCII 108 ‘l’; выводим дважды)
+++. (ASCII 111 ‘o’)
-------------------------------------------------------------------------------. (ASCII 32 ‘ ’)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++. (ASCII 87 ‘W’)
++++++++++++++++++++++++. (ASCII 111 ‘o’)
+++. (ASCII 114 ‘r’)
------. (ASCII 110 ‘l’)
--------. (ASCII 100 ‘d’)
-------------------------------------------------------------------. (ASCII 33 ‘!’)
-----------------------. (ASCII 10 ‘\n’)

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

+++++ +++++             присвоить счетчику в ячейке #0 значение 10
[                           цикл для присвоения следующим четырем ячейкам значений 70/100/30/10
  > +++++ ++          добавить 7 к ячейке #1
  > +++++ +++++       добавить 10 к ячейке #2
  > +++               добавить 3 к ячейке #3
  > +                 добавить 1 к ячейке #4
  <<<< -              уменьшить на единицу счетчик в ячейке #0
]                 
> ++ .                 'H'
> + .                  'e'
+++++ ++ .             'l'
.                      'l'
+++ .                  'o'
> ++ .                 ' '
<< +++++ +++++ +++++ . 'W'
> .                    'o'
+++ .                  'r'
----- - .              'l'
----- --- .            'd'
> + .                  '!'
> .                    '\n'

Код отформатирован для удобства чтения и снабжен комментариями. При выполнении переносы и лишние символы будут проигнорированы. Итоговая программа представляет собой строку:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
5.3  Описание программы Hello World

Разберем отформатированную команду построчно.
Первые 7 строк подготавливают память, присваивая соседним ячейкам значения, близкие к кодам символов выводимой фразы.
Присвоим ячейке #0 значение “10”, увеличивая ее на единицу 10 раз.
Начало цикла. Значение текущей ячейки - 10, поэтому содержимое цикла будет выполнено
Каждую итерацию цикла производится ряд действий над ячейками:
  #1 увеличивается на 7
  #2 увеличивается на 10
  #3 увеличивается на 3
  #4 увеличивается на 1
  #0 уменьшается на 1
Перед каждой итерацией мы возвращаемся в ячейку #0, значение которой последовательно изменяется с 10 до 0, поэтому цикл будет выполнен 10 раз
В результате в ячейках ##1-4 содержатся значения: 70, 100, 30, 10. Теперь нам потребуется гораздо меньше действий, чем в первом примере, для получения кодов символов “Hello World!”

5.4 Упражнения

1.     Измените пример с вводом-выводом так, чтобы переданные значения не перезаписывали предыдущие, а сохранялись в памяти
2.     Измените программу Hello World, чтобы вывести на экран ваше имя

Далее - Простые конструкции
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