8

对于外行来说,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怎么办?在将我的大脑包裹在如何将其调整为简单的工作之后遇到了一些困难之后,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的 s 或if/else ifs。

4

3 回答 3

4

以下是对 Brain F*ck 执行基本逻辑但复杂操作的算法:)

于 2010-08-10T05:59:17.390 回答
3

有关如何从单个 BF 控制结构开始并定义一系列越来越复杂的序列来表示更复杂的操作的说明,请参见此页面。

于 2010-08-10T05:12:55.523 回答
3

我还没有看链接,但我想AShelly 的答案可能更普遍有用......但是,以前不敢让我的手指打出一些 Brainfuck,我决定现在和时间和能够得到以下,我认为这是可行的。

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

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

    <
    [
      >>
    ]
    <
]

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

>
[
    .>
]
于 2010-08-10T05:49:44.583 回答