正则高尔夫内含 2 场可玩狩猎

xkcd 的正则高尔夫:第 1313 期漫画背后的谜题

xkcd 的正则高尔夫漫画如何开创了一种谜题类型,Peter Norvig 如何解开它,以及在哪里每天玩一道新的正则高尔夫谜题。

Regex Hunter 标志

· 阅读约 4 分钟 · 更新于

/j|bu|oo/

抓住

  • jefferson
  • buchanan
  • hoover

放过

  • fremont
  • dewey
  • gore

正则高尔夫源自 xkcd 第 1313 期漫画:写出最短的正则表达式,匹配一个列表里的每个单词,同时不匹配另一个列表里的任何单词。和真正的高尔夫一样,杆数越少越好。整个玩法都在下面这个棋盘里,来试试:

可玩狩猎标准杆 4

抓住以 -ing 结尾的单词,放过其余的。

目标 · 抓住 0/5

  • sing目标
  • ring目标
  • going目标
  • thing目标
  • swing目标

无辜词 · 误抓 0

  • ingot无辜
  • fringe无辜
  • kings无辜
  • dingo无辜
  • hinge无辜

输入正则——棋盘会实时更新。

在沙盒里试试
喜欢吗?每天都有新的狩猎。玩今天的狩猎

这就是全部玩法。乐趣在于,它很快就不再简单了。

01为它命名的漫画

2014 年 1 月,xkcd #1313《Regex Golf》让很多程序员认识了这个游戏。第一格画的是一个能匹配《星球大战》副标题、却不匹配《星际迷航》副标题的正则:

匹配11/11 符合预期
/M | [TN]|B/

应当匹配 · 星球大战6/6

  • THE PHANTOM MENACE
  • ATTACK OF THE CLONES
  • REVENGE OF THE SITH
  • A NEW HOPE
  • THE EMPIRE STRIKES BACK
  • RETURN OF THE JEDI

不应匹配 · 星际迷航5/5

  • THE WRATH OF KHAN
  • THE SEARCH FOR SPOCK
  • THE VOYAGE HOME
  • THE FINAL FRONTIER
  • THE UNDISCOVERED COUNTRY
在沙盒里试试
xkcd 给出的 10 个字符的答案。注意其中的空格——它们也是正则的一部分。

漫画的悬停文字把赌注加得更大:一个 63 个字符的正则,能匹配每一位当选美国总统的姓氏,却不匹配任何被他们击败的候选人。

正则63 字符 · 13 个片段
/bu|[rn]t|[coy]e|[mtg]a|j|iso|n[hl]|[ae]d|lev|sh|[lnd]i|[po]o|ls/

点击片段,在正则中找到它

xkcd #1313 的总统正则——13 个小片段,用 | 连在一起。

它看起来像乱码,但请把它当成一张清单来读:被 | 隔开的每个片段负责抓住几位总统。单单一个 j 就抓住了 Jefferson、Jackson 和 Johnson。

02笑点里的 bug

同一个月,Peter Norvig——时任 Google 研究总监、经典 AI 教科书的合著者——写了一个 notebook,用程序自动解正则高尔夫。他的测试第一件事就是检查漫画的答案。结果没通过:

匹配9/10 符合预期
/bu|[rn]t|[coy]e|[mtg]a|j|iso|n[hl]|[ae]d|lev|sh|[lnd]i|[po]o|ls/

应当匹配 · 胜选者5/5

  • lincoln
  • obama
  • kennedy
  • reagan
  • washington

不应匹配 · 落选者4/5

  • romney
  • mccain
  • dewey
  • gore
  • fremont
在沙盒里试试
胜选者应当匹配,落选者不应匹配。有一个落选者被误抓了。

[rn]t 抓住了 fremont——John C. Frémont,他在 1856 年的大选中输给了 James Buchanan。Norvig 发现,Randall 把那一年的第三党候选人 Millard Fillmore 当成了 Buchanan 的对手。正则高尔夫的答案,只和它的单词列表一样可靠。

03计算机怎么玩正则高尔夫

Norvig 的求解器是一段很漂亮的推理,值得了解,因为优秀的人类玩家也是这么想的:

  1. 收集候选片段。 取出胜选者名字里的所有短片段——一到四个字符,其中一些字母换成 .——比如 bu、a.a 或 r.e$。
  2. 只保留安全的片段。 一个片段只有在至少匹配一个胜选者、并且不匹配任何落选者时才有用。
  3. 覆盖所有胜选者。 接着挑选片段,直到每个胜选者都被匹配。这就是经典的集合覆盖问题,它是 NP 困难的——所以求解器用贪心法,每次挑选在“覆盖的胜选者”和“花费的字符”之间权衡最好的片段。
  4. 用 | 把它们连起来。

结果比漫画短了 9 个字符:

对比缩短 14%

棋盘lincoln · obama · kennedy · reagan · washington vs fremont · romney · mccain · dewey · gore

  1. xkcd #1313抓住 5/5,误抓 163
    /bu|[rn]t|[coy]e|[mtg]a|j|iso|n[hl]|[ae]d|lev|sh|[lnd]i|[po]o|ls/
  2. norvig 求解器能解出54
    /a.a|a..i|j|li|a.t|i..n|oo|bu|ay.|n.e|r.e$|ru|ls|po|v.l/
试试短的那个
漫画的正则对比 Norvig 的求解器,测试样本是一部分胜选者和落选者。Norvig 的正则还能通过所有总统的完整名单。

它把《星球大战》那一格也缩短了——从 10 个字符缩到 9 个:

对比缩短 10%

棋盘THE PHANTOM MENACE · ATTACK OF THE CLONES · REVENGE OF THE SITH · A NEW HOPE · THE EMPIRE STRIKES BACK · RETURN OF THE JEDI vs THE WRATH OF KHAN · THE SEARCH FOR SPOCK · THE VOYAGE HOME · THE FINAL FRONTIER · THE UNDISCOVERED COUNTRY

  1. xkcd能解出10
    /M | [TN]|B/
  2. norvig能解出9
    / T|E.P|PE/
试试短的那个

04从谜题到每日习惯

正则高尔夫简史:2014 年 1 月的 xkcd #1313(63 个字符),同月 Norvig 的 notebook(54 个字符),浏览器里的关卡包,以及 Regex Hunter 的每日狩猎

regex.alf.nu 这类浏览器游戏把这个点子做成了可以一关关刷下去的关卡包。Regex Hunter 走的是另一条路——Wordle 的路:

  • 每天一场狩猎

    所有人都一样,有标准杆等你挑战,还有连胜要保持。

  • 练习包

    每个练习包专练一种技巧,从锚点到反向引用。

  • 社区狩猎与狩猎赛

    由玩家出题的狩猎,以及在同样的棋盘上和其他人实时比拼。

  • 学院与沙盒

    从零开始学正则表达式,然后随意测试任何东西。

05来自 Norvig notebook 的一道题

Norvig 还让最受欢迎的婴儿名字互相较量。下面是五个男孩名和五个女孩名——标准杆就是他答案的长度。你能追平它,甚至更短吗?

可玩狩猎标准杆 10

抓住男孩的名字,放过女孩的名字。

目标 · 抓住 0/5

  • jacob目标
  • mason目标
  • ethan目标
  • noah目标
  • aiden目标

无辜词 · 误抓 0

  • madison无辜
  • emily无辜
  • abigail无辜
  • sophia无辜
  • olivia无辜

输入正则——棋盘会实时更新。

在沙盒里试试
喜欢吗?每天都有新的狩猎。玩今天的狩猎

06今天就来玩正则高尔夫

玩今天的狩猎 →每天一道新的正则高尔夫谜题:抓住怪物,放过无辜者,争取低于标准杆。免费,在浏览器里就能玩,无需注册。

如果你想学技巧而不是历史,请阅读正则高尔夫策略:如何打出低于标准杆的成绩。