对于未启动的用户,Brainfuck是一种图灵完备的语言,只有8个命令,所有这些命令在C中都具有文字等效项:

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

在任何具有软件包管理器的Linux发行版上,您都应该能够找到并安装软件包beef,这是Brainfuck解释器,因此您可以在家中玩。

从上面可以看到,Brainfuck只有一个控件结构[…],它转换为C的方式是:
while (*ptr) { … }

这使您可以通过BASIC对IF VAR = 0 THEN GOTO 10进行所有控制。以下将调用getchar(),直到返回0为止:
,    # *ptr = getchar();
[    # while (*ptr) {
  >,    # *(++ptr) = getchar();
]    # }

但是,如果我只想读取换行符char \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,嵌套ifif/else if

最佳答案

我还没有看过链接,但我想AShelly's answer可能更通用...但是,由于以前不敢让我的手指敲打Brainfuck,所以我决定现在就好了并能够获得以下内容,我认为这是可行的。

下半部分仅用于打印出第一部分捕获的内容。而且,我不会说谎,在尝试解决这个问题后,我的大脑确实的确感到完全“干”了……一种非常恰本地命名的语言,呵呵。

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

    <
    [
      >>
    ]
    <
]

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

>
[
    .>
]

关于computer-science - 在Brainfuck中实现控制结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3421347/

10-13 21:58