对于外行来说,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 if
s。