说出来你可能不信,那条著名的单行迷宫程序我敲过不下百遍,但8-Bit Guy最新一期的拆解视频,还是让我花了整整几天钻进去研究。四十年前第一次在说明书里看到这行代码时,只当它是魔术;今天再拆开,里面至少藏着四个被无数人忽略、却值得写进现代编程笔记的实用技巧。

先看那条经典原版:

打开网易新闻 查看精彩图片

10 PRINT CHR$(205.5+RND(1)); : GOTO 10

在C64上跑起来,屏幕上不断滚出随机的迷宫图案。核心在于CHR$(205.5+RND(1))这个表达式——RND(1)返回0到0.999之间的浮点数,加上205.5后落在205.5到206.499区间,CHR$函数直接截断小数,于是大约50%的概率得到字符205,50%的概率得到字符206。这两个代码在PETSCII字符集里正好是斜杠符号/和反斜杠\,随机交替打印,屏幕自动滚动,对角线首尾相接,就构成了无限迷宫。

整套逻辑摞进一行代码,靠的是用一个算术表达式取代了条件分支。当年看固然是极客炫技,放在今天,消除IF语句这件事在特定场景下依然值得琢磨——它用一个浮点加截断操作,就把随机二选一变成了零分支的单行表达式。这个技巧在早期C64和VIC-20的随机附赠手册里就能找到,不少老程序员第一次撞见编程的惊喜,就是被这段代码点燃的。

然后8-Bit Guy亮出了第一个花活:让代码比一行还短,短到零行。怎么做到的?BASIC的直接模式里可以直接跑FOR...NEXT循环,不需要写行号,而且STEP 0是合法的——步长为零,计数器永远不往前走,循环就永远不会结束。拼起来就是:

FOR A=0 TO 1 STEP 0:PRINT CHR$(205.5+RND(1));:NEXT

零行程序,无限迷宫。STEP 0作为刻意设计的死循环,第一次看到时确实有种钻了语言规则空子的快感,类似C语言里WHILE(1)的那种编程直觉。

技巧还没完,视频后半段进入速度优化环节,信息量更大。第一条优化是把PRINT相关的计算尽量提到循环之外,减少每次重复求值的开销。

第二条和随机数有关——BASIC里不同随机数生成方式的速度差异大到必须认真对待,选对生成器能让迷宫滚动的帧率肉眼可见地提升。第三条则是预定义字符串常量:把CHR$(205)和CHR$(206)分别存成变量,循环体里直接调用,省去每次拼接和类型转换的消耗。这三刀砍下来,迷宫的生成速度直接快了一个量级。

回过头看,这段四十年前的代码其实一直在讲同一件事:在资源极度受限的环境下,用结构性的聪明换性能的大提升。它用的每一个技巧单独拎出来——浮点数截断做随机、步长为零做死循环、预计算和常量外提——都是特定约束下的务实解法,没有一个是花架子。这也正是为什么今天重读这段代码,依然能感觉到一股没有随时间褪色的巧劲。