对于不熟悉的人来说,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
语句。
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
- NullUserException