文言文编程95后又出新作,这次在287051行古诗中找出了“唐诗幻方”!| 专访

还记得那位用文言文编程的中国小伙吗?

图 | 文言文编程(来源:受访者)

2019 年 ,22 岁的上海小伙黄令东用文言文编程,当时他还在读大四,凭借该项目小伙子瞬间“原地出道”。

图 | 文言文编程的 HELLO WORLD(来源:受访者)

最近,他又开发出了 “唐诗幻方”。如下图所示,这二十五字横着读、竖着读都是五句唐诗。每句诗都出自唐代名家之手,如李白、高适、张祜……

图 | “唐诗幻方”(来源:受访者)

再比如下面这首,横读、竖读也都是五句唐诗,出自白居易、姚合等人的诗集。

心如七十人
如何十年間
七十未成事
十年成底事
人間事事慵

五言的诗句能组成 “幻方” 的,在《全唐诗》二十八万句中有且仅有两组。三言诗就多得多了,下面是两例:

拂秋水秋夜長水長東

惜春心
春歌斷
心斷絕

(来源:受访者)

再把汉字编译成数字,你会发现这是一个对称矩阵。

(来源:DeepTech 自制)

谈及为何做这样的研究,黄令东打趣称:“某一天吃得太饱,读了一点诗,就忽然有了这样的想法。”

问他做“唐诗幻方”经历了哪些步骤,他的回答依然很有趣:

1. 吃饱
2. 写代码
3. 运行
4. 睡觉
5. 醒来发现还没运行好,换个算法写一遍
6. 再运行
7. 出门兜一圈
8. 运行出来了,整合结果,发布代码

从集句角度来说,集句诗、八破图、酒令等都是古人爱玩的游戏。从文字本身的限制上来说,古人在回文诗和璇玑图上也玩得很好。

但黄令东猜测,在集句的同时、还能形成对称矩阵,估计古人玩不起来。

他认为全唐诗里估计一组也未必找得到,那究竟是不是这样呢?他用 C 语言写了 210 行代码,于是就有了“唐诗幻方”这个作品。

他认为,这个玩法和古人的文字游戏一脉相承的。只是如今我们有了计算机的辅助,可以玩难度更高的游戏。

如果由古代诗人创作这样的幻方,其实也并不特难,甚至给定第一句,后四句他也能凑出来,所以他认为本次研究更倾向是一种“由微茫概率而产生的浪漫主义”。

说到本次使用的技术,他竟然说 “没有技术”。其表示,不同于 AI 写诗这类对创作力有要求的题目,集句可以算作一个搜索问题(Search problem),这类问题其实非常经典。

甚至五十年前的程序员就能做,而黄令东写的 C 代码,在五十年前也能跑,用到的算法在五十年前也已是人类共识,非要说有什么区别,可能只是跑得更快。

对于本次研究的原理,他认为非常简单。首先提出问题,问有没有二十五个字,排成五乘以五的矩阵,横读竖读都是五句唐诗?

图 | 黄令东找出来的 259 行三字唐诗中的一部分(来源:受访者)

他解释称,这个问题最糟糕的算法是在二十五个位置上,找遍所有的汉字,以希冀某种组合可以达到要求。假设可以入诗的字有五千个,那么需要遍历五千的二十五次方个答案。用计算机界的比喻来讲,比可观测宇宙的原子还要多一百亿倍。

次糟糕的算法是,从全唐诗二十八万句五言中找出五句来排列组合,会有二十八万的五次方个可能答案。虽然比前面缩小了数十个数量级,然而依旧不现实。

但他通过观察这二十五字的规律后发现:第一句里的每个字、都必须可以作为一句的第一字;同理,第二句的每个字、和第一句中同一个位置的字连起来,都必须可以作为一句的前两个字;

同时,第二行的第一个字、必与第一行的第二字相同,第三行的第二字、必与第二行的第三字相同,依此类推。

图 | 唐诗幻方的 GitHub 页面(来源:受访者)

在遍历全唐诗的时候,一旦检测到这样的规则被破坏,即可立刻抛弃这一条搜索的路径,跳到下一个分支。

比如:目前假设第一句是 “菡萏发荷花”,他发现 “萏” 字不存在单独作为某句诗第一字的情况,所以就不必再搜索以 “菡萏发荷花” 为第一句的可能答案了。

假设第一句选了 “镜湖三百里”,发现以这五字起头的句子都有,那就再来寻找第二句,假使又遍历到 “菡萏发荷花”,发现以 “镜菡”“湖萏” 这些开头的诗句统统不存在,那就不必再搜索以 “菡萏发荷花” 为第二句的答案了。

有了这些判断,搜索范围骤然减小很多,他发现在第二句的位置,99% 的唐诗都被卡嚓掉了。

除此之外,他希望能快速地知道,某几个字是否可作为一句唐诗的开头。比较 “天真” 的算法是,把每句唐诗都与它比对,这时需要线性的时间来做这个确认。

图 | 全唐诗中的汉字(来源:https://ctext.org/quantangshi/zh)

所以他对此做了一个优化:把全唐诗每一句话的第一字、前两字、前三字、前四字,都分别存在各自的哈希集内,这样就可以近乎瞬间地查找到。

于是,在不到一小时里,他就在目前的程序中,找到全唐诗里所有的“唐诗幻方”了。不过黄令东认为,他这样的方法未必是最好的,但既然达到了他的目标,所以就暂且如此。

正如他在项目结尾所写:“余于算法颇无用意,学诗亦未特工。故所想未必为佳,其法亦未必为速。诸公有妙思者,吾谨愿闻焉。”

文言文编程大火,但从未打算商业化

2019 年底的文言文编程,是黄令东走红的代表作。他说很久以前就有做文言文编程的想法。一开始,他先写了一个阿拉伯数字转换中文的小模块作为试验,但一时没想好编程语言的语法部分,所以就在广览古籍的同时慢慢想。

后来他发现书看得愈多,愈觉得不足,以至于拖延无期。所以不如立刻下手,即使做出来不完美,但也算是抛砖引玉的作品。当时正好期末考试,学校停课复习,所以用大把时间写出了文言文编程项目。

那时,他从未写过类似项目,也没有学过编译器原理的课程,全程都是一边摸索一边写。他用的方法是,先用文言文语言写出几个想象中合法的程序样本,然后改进编译器来使它能在样本上运行。

有时,也会发现样本中有矛盾或不合理的地方,所以文言文语言定义与其编译器是同时发展的。初始的版本可以编译至 JavaScript 和 Python 两种语言,在开源社区的贡献下支持第三种 Ruby 目标语言。

// JavaScript var甲= 3; for (let _rand1 = 0; _rand1 <甲; _rand1++) {     var _ans1 = '问天地好在。';     console.log(_ans1); };# Python甲=3 for _rand1 in range(甲):     _ans1='问天地好在。'     print(_ans1);

# Ruby甲=3甲.times do |_rand1|     _ans1='问天地好在。'     p([_ans1].join) end

图 | JS 、Python 和 Ruby 三种语言的代码(来源:受访者)

文言文编程大火之后,他收到很多信件,对于该项目的商业化,他说:“我没有想过,也不想想。当时我是因为有意思而作,火是因为有很多人同样觉得有意思,从而激发了他们的思考、辩论、贡献、和衍生的作品。这样作为一个开源项目,我觉得挺好。古今从事创作而得到乐趣的人,我想大抵是这样一种想法。

出生于上海,从小喜欢绘画

黄令东从小生活在上海,他说自己并不算十分努力,假使算得上优秀,都得益于环境和教育。小时候父母经常带他出国旅游,参观博物馆和画展。每周末还学习画图,结识了不少在艺术上很有见地的师友。

图 | 黄令东(来源:受访者)

(0)

相关推荐