Реализация структур управления в Brainfuck - PullRequest
7 голосов
/ 06 августа 2010

Для непосвященных, Brainfuck - это полный по Тьюрингу язык только с 8 командами, каждая из которых имеет буквальный эквивалент в C:

bf    c
----------------------
>     ++ptr;
<     --ptr;
+     ++*ptr;
-     --*ptr;
.     putchar(*ptr);
,     *ptr=getchar();
[     while (*ptr) {
]     }

В любом дистрибутиве Linux, в котором есть менеджер пакетов, вы должны иметь возможность найти и установить пакет beef, интерпретатор Brainfuck, чтобы вы могли поиграть дома.

Как вы можете видеть выше, Brainfuck имеет только одну управляющую структуру, […], которая переводится в C как:

while (*ptr) { … }

Что дает вам полный контроль над IF VAR = 0 THEN GOTO 10 от Бейсика. Следующий вызов будет вызывать getchar(), пока не вернется 0:

,    # *ptr = getchar();
[    # while (*ptr) {
  >,    # *(++ptr) = getchar();
]    # }

Но что, если я только хочу прочитать символ новой строки \n? После некоторых трудностей, связанных с тем, как это можно приспособить, чтобы работать как простой if, я придумал следующее:

,            # *ptr = getchar();      /* store input                               */
----------   # *ptr -= 10;            /* test for \n by subtracting 10 before loop */
[            # while (*ptr) {         /* if *ptr == 0, last char read was \n       */
  ++++++++++   # *ptr += 10;          /*   wasn't \n, add 10 back to val under ptr */
  >,           # *(++ptr) = getchar();
  ----------   # *ptr -= 10;
]            # }

(Если у кого-то есть лучший способ сделать это, пожалуйста, дайте мне знать)

Теперь допустим, что я хочу протестировать разрыв из этого цикла на \r в дополнение к \n. Как я могу проверить любой из них, учитывая, что у меня есть только одна возможность вырваться из цикла? Моя цель - иметь возможность эмулировать switch, вложенные if с или if/else if с.

Ответы [ 3 ]

4 голосов
/ 10 августа 2010

Здесь - алгоритмы для выполнения базовой ЛОГИЧЕСКОЙ, но сложной операции для мозга F * ck:)

3 голосов
/ 10 августа 2010

Я еще не взглянул на ссылку, но я представляю, что Ответ А.Шелли , вероятно, более универсально полезен ... однако, не осмеливаясь позволить моим пальцам набрать какой-нибудь Brainfuck раньше, Я решил, что сейчас настало такое же хорошее время, как и у любого другого, и я смог получить следующее, что, как мне кажется, работает.

Вторая половина просто для распечатки того, что было захвачено первой частью. Кроме того, я не буду лгать, мой мозг действительно чувствует себя полностью «оттраханным» после попытки решить это ... Очень удачно названный язык, хе.

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

    <
    [
      >>
    ]
    <
]

++++++++++++
[
    <
]

>
[
    .>
]
3 голосов
/ 10 августа 2010

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

...