在Brainfuck中实现控制结构

8

对于不熟悉的人来说,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();
]    # }

但是如果我只想读取到换行符\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语句。


1
关于这种脑残语言,不应该有任何严肃的质疑。实际上,它应该被称为“脑残” :-) - paxdiablo
1
@SCMadsen 这是“Hello World”程序:++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. - NullUserException
你可以告诉我们 >[><] 的结果吗?:-)))) - ZXX
3个回答

4

这里提供了一些 Brain F*ck 基本逻辑但复杂的操作算法 :)


链接已失效 =/ - kingsfoil

3
我还没有查看链接,但我想AShelly的答案可能更加普遍有用...然而,因为我之前从未尝试过编写Brainfuck代码,所以现在是一个好时机,我已经得到了以下代码,我认为它可以正常工作。
第二部分只是为了打印出第一部分捕获的内容。此外,我不会撒谎,我的大脑确实在尝试解决这个问题后感到非常困惑...这是一个非常恰当命名的语言,嘿。
+
[
    >,
    ----------
    [
        ---
        [
            +++++++++++++
            >>
        ]
    ]

    <
    [
      >>
    ]
    <
]

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

>
[
    .>
]

3

请参考此页面,了解如何使用单个BF控制结构开始,并定义一系列越来越复杂的序列来表示更复杂的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接