1990年最硬核的游戏攻略:他给每个字手动排队

1990 年代的某个深夜,一位 ID 叫 rs1n 的玩家在写《超级银河战士》(Super Metroid)的图文攻略。他用的工具是纯文本编辑器,输出格式是每行 75 个字符的等宽文本。这类攻略有一个所有老玩家都熟悉的视觉特征:段落的右边缘参差不齐。等宽字体没有比例字体那种把空格压窄再分配的余地,一行文字差半个字符就是差半个字符。

但 rs1n 交出的攻略不一样。GameFAQs 上的这份文件(FAQ ID 10114,v2.12,2001 年 4 月 17 日最后更新)里,956 个正文段落行的右边缘全部精确落在第 75 列,段内没有出现一个用来凑宽度的双空格。写完这份攻略的最后,有人在 FAQ 区问他用了什么排版软件,他的回答只有一句话:

None. I just chose words carefully so that everything lined up on the right hand side. Everything was done with an ASCII editor.

什么软件都没用。我只是小心地选词,让每一行都对齐。

2026 年 8 月 30 日,设计师 Marcin Wichary 在他的博客 Unsung 上把这段排版史重新挖了出来,这篇文章当天冲上了 Hacker News 首位(796 分、204 条评论)。它讲的不只是一个玩家的偏执,而是一整类排版问题的极限案例:当排版工具全部失效时,排版可以退到哪里去。

等宽排版的数学困境

要先说清楚为什么这件事难。比例字体( proportional font )里,i 占的宽度是 m 的几分之一,排版软件做两端对齐时,把一行里所有空格的宽度微调几个百分点,肉眼几乎看不出来。桌面排版软件和浏览器都在做这件事。

等宽字体没有这个选项。每个字符占的宽度一样,空格也一样。一行文字要么在某个整数列数上结束,要么就差一点。Wichary 在文章里列出了传统文本文件的三条路,每条都有代价:

方案做法代价
左对齐(默认)不处理右边缘参差
居中手动数空格半个字符的余数无处安放,永远差一点
两端对齐拉伸空格填满行宽等宽字体里空格只能整倍加宽,词距大得刺眼(见下图)
断词加连字符行尾拆词连字符异常显眼,还会污染复制粘贴
重写选词换词,直到每行恰好填满工作量没有上限

前三条是"接受不完美",只有最后一条是真的把右边缘对齐。它的代价藏在一组数字里。

等宽字体下的两端对齐:行两侧对齐了,代价是行内空格忽大忽小

Super Metroid 攻略原文截图,每行右边缘精确对齐在第 75 列

每一行都是一道约束题

把 rs1n 的攻略抽象一下:一行 75 列、含 N 个单词的文本,要满足"所有单词长度之和加上 N-1 个空格恰好等于 75"。这是一个子集和式的约束,每一行都要独立求解一次。

我按这份攻略的原始文本实测了词长分布(16,998 个单词):全文平均词长 4.22 个字符,最常见的词长是 4(4,131 个)和 3(3,907 个)。一行通常放 13 到 14 个单词。用这份实测分布做一个独立词采样,随机抽 13 个单词恰好能填满一行的概率大约是 1/37。词数少的时候更严苛:9 个单词的一行,随机命中概率约十三万分之一。

1/37 听起来不算绝望,但要乘 956 次。956 行全部自然命中的概率在数量级上小于 10 的负 300 次方。换句话说,这份攻略的对齐不可能靠运气,它是逐行重写出来的:写一句,数一遍,差两个字符就换一个词,再数一遍。超过 17,000 个单词的攻略,每一行都是这么凑出来的。

这就是"选词排版"的代价结构:单步成功率不算太低,但步数极多,且每一步失败都要回溯到词汇选择层面重试。在没有辅助工具的年代,这基本是把一个 NP 难度的约束满足问题用人力硬跑。

Unsung 文章的分享卡片

排版系统的参照系:badness 0

在 Donald Knuth 的 TeX 排版系统里,每一行断行方案会被计算一个 badness 值(不良度),衡量空格拉伸后偏离理想宽度的程度,badness 超过阈值的行就是"难看的行",TeX 会尽量避免。术语里,badness 0 的行就是空格完全不需要拉伸、天然契合的理想行。

rs1n 做的事情,用这个框架描述就是:他把整份 17,500 词的文档手工做到了每一行都是 badness 0。

这条线索在 2024 年被计算机科学家 Tom Murphy VII(YouTube 频道 suckerpinch)接了下去。他在卡内基梅隆大学的讽刺性学术会议 SIGBOVIK 2024 上发表了一个叫 Badness 0 的项目:让 LLM 在改写文本时约束每一行的长度,用机器重演一遍 rs1n 的人工过程。项目页面(tom7.org/bovex)提供了论文和演示视频。Hacker News 上有人把 rs1n 的攻略和这个项目放在一起讨论:人用文本编辑器逐行凑出来的东西,模型几秒钟能逼近,但前者作为作品的那种"人竟然愿意花这么多时间"的冲击力,是后者不打算复刻的。

攻略站黄金时代的一缕侧影

这个故事的另一层价值在攻略本身。1990 年代到 2000 年代初,GameFAQs 是游戏信息的中心:纯文本、ASCII 字符画、每行 75 列上下,是整个社区事实上的排版标准。作者们用记事本和 DOS 时代的编辑器写作,用字符拼出地图和表格。

rs1n 的这份 Super Metroid 攻略是这个生态里的极端样本。同类作者会为攻略做 ASCII 艺术图、目录索引、版本记录(这份文件的目录页还留着 "TABLE OF CONTENTS v2.12 (04-17-01)"),排版是他们表达认真程度的方式。Wichary 的博客 Unsung 专门记录这类"软件工艺"——他本人写过讲键盘史的《Shift Happens》,参与过 Google 首页的吃豆人 Doodle 和 Medium 的下划线细节优化,对这种藏在界面背后的偏执有职业级的敏感。

评论区还贡献了两条相关线索。一条说《X 档案》编剧 Chris Carter 写台词时有类似的排版强迫症,要求剧本页面不出现孤行,这塑造了剧集标志性的台词节奏。另一条引用了魔术组合 Penn & Teller 的一句话:有时候魔术就是有人在一件事上花的时间超出了任何人的合理预期。两条都出自 Hacker News 讨论区的参与者转述,原始出处待考,作为延伸阅读放在这里。

复制粘贴的代价

最后值得记下选词排版的一个工程细节:它对复制粘贴是友好的。因为行内没有多余的双空格、行尾没有凑宽度的填充字符,任何人从这份攻略里复制一段文字,得到的都是干净的连续文本。断词加连字符的方案做不到这一点——复制出来的文字会带着行尾连字符和换行符。

这大概是"用内容换排版"路线最反直觉的地方:它看起来是最笨的方法,产出的却是唯一同时满足"右边缘对齐"和"文本可复用"两个条件的方案。后来所有的排版引擎都用富文本格式解决了这个问题,但在 1990 年代的纯文本世界里,rs1n 用最原始的工具拿到了唯一解。

那份攻略至今还在 GameFAQs 上,链接和版本号都在。下一次有人抱怨 Markdown 的换行规则麻烦时,可以想想 1990 年代那位逐词凑行的作者:排版工具的每一步进化,都是在替我们免除某种人力,只是偶尔,也会替我们免除那种偏执留下的杰作。


来源: