Реализация управляющих структур в Brainfuck

Для непосвященных, 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 от BASIC. Следующее будет вызывать getchar () , пока не вернется 0 :

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

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

,            # *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 . Как я могу проверить любой из них, учитывая, что у меня есть только одна возможность вырваться из цикла? Моя цель - иметь возможность эмулировать переключатель , вложенный , если с или , если / еще, если с.

7
задан Jeremy Banks 29 January 2013 в 19:35
поделиться

3 ответа

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

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

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

    <
    [
      >>
    ]
    <
]

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

>
[
    .>
]
3
ответ дан 7 December 2019 в 01:14
поделиться

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

4
ответ дан 7 December 2019 в 01:14
поделиться

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

3
ответ дан 7 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: