五分钟包您学会 brainfuck(健)脑操语言
(非句首请勿首字母大写 brainfuck 谢谢)
包学包会,学不会免费再学。
将八个操作符 < > + - [ ] . , 分别转写为:
然后找一张方格纸,对就是小学作文本那种,一支铅笔(不,钢笔不行,Lamy 的也不行),一块橡皮,一张从你的旧 C 语言书上撕下来的 ASCII 码表。
现在来看 +++[>+<-] 这行程序。按照我们的转写,它变成:上上上始右上左下终。
接下来在你的方格纸上的第一个格子里写下 0 。
[0]
很好。现在我们一边读转写好的程序,一边按照以下规则行事:
我们开始吧。方括号代表当前你盯着看的格子。首先是上,上,上:
[3]
接下来,始:
[3]
嗯,你要重复做它到「终」之间的事情。首先是「右」:
3[0]
上:
3[1]
左:
[3]1
下:
[2]1
终:
<del>大明湖畔</del>碰到「始」之前你盯着的那个格子,你还记得吗?碰巧就是当前这个。目前里面是 2 ,不是 0,所以我们回去「始」。
右:
2[1]
上:
2[2]
左:
[2]2
下:
[1]2
终:
回去「始」
右:
1[2]
上:
1[3]
左:
[1]3
下:
[0]3
终:
格子里是 0 了,你可以跳过「终」读下去了。 这段程序就此完结,但如果你读懂了这些,其实就已经看懂了我那个程序最开始的部分:
++++++++++[>+++>++++>+++++++>++++++++++>+++++++++++<<<<<-]
无非就是,先把最左边的格子加到 10,然后向右移动,移动到第二个格子里加 3,第三个加 4,第四个加 7,第五个加 10,第六个加 11,然后向左移动五次,回到第一格,减 1。如此重复十次之后,最左边的格子变成 0,循环终止,而我有了如下格子:
[0] 30 40 70 100 110
接下来的部分,就是挪到某个格子,加上或者减去若干次 1,直到获得想要字母的 ASCII 代码,然后用 . 把它打印出来。比如紧接着的 >>>++. 就是右移三次,到写了 70 的格子上,加两次 1,得到 ASCII 72 ,大写字母 H,再用 . 把它显示出来。
很简单吧?学会了?恭喜你……
-
It is practically impossible to teach functional programming to students that have had a prior exposure to brainfuck: as potential programmers they are mentally mutilated beyond hope of regeneration.
–– Edsger W. Dijkstra (paraphrased)
-
(开玩笑的。新年快乐,上上下下左右左右 BA start!)