在Brainfuck中实现控制结构

Rya*_*ney 7 computer-science turing-machines brainfuck

对于没有经验的人来说,Brainfuck是一种图灵完备的语言,只有8个命令,所有这些命令在C中都有文字等价物:

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

在任何带有软件包管理器的Linux发行版上,你应该能够找到并安装这个软件包beef,一个Brainfuck解释器,这样你就可以在家里玩了.

如上所示,Brainfuck只有一个控制结构,[…]它转换为C:

while (*ptr) { … }
Run Code Online (Sandbox Code Playgroud)

这让您可以IF VAR = 0 THEN GOTO 10从BASIC获得所有控制权.以下将调用,getchar()直到它返回0:

,    # *ptr = getchar();
[    # while (*ptr) {
  >,    # *(++ptr) = getchar();
]    # }
Run Code Online (Sandbox Code Playgroud)

但是,如果我只想读取换行符\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;
]            # }
Run Code Online (Sandbox Code Playgroud)

(如果有人有更好的方法,请告诉我)

现在让我们说我想测试\r除了循环之外的那个\n.考虑到我只有一次突破循环的机会,我该如何测试?我的目标是能够模仿switch,嵌套ifs或if/else ifs.

Tim*_*one 3

我还没有看链接,但我想AShelly 的答案可能更普遍有用……但是,之前不敢让我的手指输入一些 Brainfuck,我决定现在也可以时间一样,并且能够得到以下内容,我认为这是有效的。

后半部分仅用于打印第一部分捕获的内容。另外,我不会说谎,在尝试解决这个问题后,我的大脑确实感觉彻底“操蛋”了……一种命名非常恰当的语言,呵呵。

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

    <
    [
      >>
    ]
    <
]

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

>
[
    .>
]
Run Code Online (Sandbox Code Playgroud)