Привет мир! в Brainfuck

Следующий фрагмент кода взят из Википедии и является преамбулой того, что кажется стандартным Hello World! программа в Brainfuck ...

1. +++++ +++++             initialize counter (cell #0) to 10
2. [                       use loop to set the next four cells to 70/100/30/10
3.    > +++++ ++              add  7 to cell #1
4.    > +++++ +++++           add 10 to cell #2 
5.    > +++                   add  3 to cell #3
6.    > +                     add  1 to cell #4
7.    <<<< -                  decrement counter (cell #0)
8. ]

Я понимаю суть того, что здесь происходит, но чего я не понимаю, так это механизма того, что происходит в строках с 3 по 6. Если +++++ +++++ добавляет 10 к значению в a[0], почему указатель увеличивается на единицу и выполняется ++*ptr семь? раз приводит к a[1] равному 70? Не следует a[1] = 7? Кажется, что с a[1] по a[4] волшебным образом увеличиваются в десять раз, и я не понимаю почему.


person Dan Forbes    schedule 08.01.2014    source источник
comment
Цикл выполняется десять раз.   -  person Andrew Morton    schedule 08.01.2014
comment
Большое тебе спасибо! Я знал, что мне не хватает чего-то дурацкого ...   -  person Dan Forbes    schedule 08.01.2014
comment
Да, ты прав. Мне показалось, что я пропустил / пролистал вторую часть первого абзаца, описывающего программу. Моя вина.   -  person Dan Forbes    schedule 09.01.2014
comment
Возможный дубликат Как на самом деле работает Brainfuck Hello World?   -  person Stevoisiak    schedule 04.05.2017


Ответы (3)


Символы [] обозначают петлю. 10 +s перед ним указывают, сколько раз будет выполняться цикл. Это становится ясно, когда вы понимаете, что означают различные команды и <<<< - последовательность команд.

Каждый раз, когда цикл запускается, он выполняет следующие шаги:

> move the pointer 1 space to the right
+++++ ++ add 7 to the current pointer
etc 3 more times > > >
<<<< - move back to the counter and decrement

Это дает эффект добавления «7, 10, 3, 1» 10 раз. Другими словами, если вы записываете значения в первых 5 местах указателя при запуске цикла, как будто они находятся в массиве:

[10, 0, 0, 0, 0]     at first
[9, 7, 10, 3, 1]     after first run
[8, 14, 20, 6, 2]    after second
...
[0, 70, 100, 30, 10] up to this, the loop ends since the counter is 0,
                     and control continues
person Tim S.    schedule 08.01.2014

На этом сайте есть отличный визуализатор мозгов: http://fatiherikli.github.io/brainfuck-visualizer/ это упрощает понимание языка, который требует от мозгов.

person confused    schedule 05.05.2015

++++++++++ делает ячейку 0 равной 10. Затем [ запускает цикл. В цикле каждая итерация добавляет номер набора к другим ячейкам. Например, он каждый раз добавляет 7 к первой ячейке. Последняя строка цикла <<<< - возвращает указатель на ячейку 0 и уменьшает его. Таким образом, каждая итерация заставляет ячейку 0 обратный отсчет. Когда он достигает 0, цикл останавливается, и программа продолжается. Следовательно, он добавляет 7 к ячейке 1 десять раз, и этот цикл делает ячейку 1 = 10 * 7.

person I. Golsby    schedule 26.12.2016