还记得那位用文言文编程的中国小伙吗?
图
文言文编程(来源:受访者)
年,22岁的上海小伙黄令东用文言文编程,当时他还在读大四,凭借该项目小伙子瞬间“原地出道”。
图
文言文编程的HELLOWORLD(来源:受访者)
最近,他又开发出了“唐诗幻方”。如下图所示,这二十五字横着读、竖着读都是五句唐诗。每句诗都出自唐代名家之手,如李白、高适、张祜……
图
“唐诗幻方”(来源:受访者)
再比如下面这首,横读、竖读也都是五句唐诗,出自白居易、姚合等人的诗集。
心如七十人如何十年間七十未成事十年成底事人間事事慵
五言的诗句能组成“幻方”的,在《全唐诗》二十八万句中有且仅有两组。三言诗就多得多了,下面是两例:
拂秋水秋夜長水長東
惜春心春歌斷心斷絕
(来源:受访者)
再把汉字编译成数字,你会发现这是一个对称矩阵。
(来源:DeepTech自制)
谈及为何做这样的研究,黄令东打趣称:“某一天吃得太饱,读了一点诗,就忽然有了这样的想法。”
问他做“唐诗幻方”经历了哪些步骤,他的回答依然很有趣:
1.吃饱2.写代码3.运行4.睡觉5.醒来发现还没运行好,换个算法写一遍6.再运行7.出门兜一圈8.运行出来了,整合结果,发布代码
从集句角度来说,集句诗、八破图、酒令等都是古人爱玩的游戏。从文字本身的限制上来说,古人在回文诗和璇玑图上也玩得很好。
但黄令东猜测,在集句的同时、还能形成对称矩阵,估计古人玩不起来。
他认为全唐诗里估计一组也未必找得到,那究竟是不是这样呢?他用C语言写了行代码,于是就有了“唐诗幻方”这个作品。
他认为,这个玩法和古人的文字游戏一脉相承的。只是如今我们有了计算机的辅助,可以玩难度更高的游戏。
如果由古代诗人创作这样的幻方,其实也并不特难,甚至给定第一句,后四句他也能凑出来,所以他认为本次研究更倾向是一种“由微茫概率而产生的浪漫主义”。
说到本次使用的技术,他竟然说“没有技术”。其表示,不同于AI写诗这类对创作力有要求的题目,集句可以算作一个搜索问题(Searchproblem),这类问题其实非常经典。
甚至五十年前的程序员就能做,而黄令东写的C代码,在五十年前也能跑,用到的算法在五十年前也已是人类共识,非要说有什么区别,可能只是跑得更快。
对于本次研究的原理,他认为非常简单。首先提出问题,问有没有二十五个字,排成五乘以五的矩阵,横读竖读都是五句唐诗?
图
黄令东找出来的行三字唐诗中的一部分(来源:受访者)
他解释称,这个问题最糟糕的算法是在二十五个位置上,找遍所有的汉字,以希冀某种组合可以达到要求。假设可以入诗的字有五千个,那么需要遍历五千的二十五次方个答案。用计算机界的比喻来讲,比可观测宇宙的原子还要多一百亿倍。
次糟糕的算法是,从全唐诗二十八万句五言中找出五句来排列组合,会有二十八万的五次方个可能答案。虽然比前面缩小了数十个数量级,然而依旧不现实。
但他通过观察这二十五字的规律后发现:第一句里的每个字、都必须可以作为一句的第一字;同理,第二句的每个字、和第一句中同一个位置的字连起来,都必须可以作为一句的前两个字;
同时,第二行的第一个字、必与第一行的第二字相同,第三行的第二字、必与第二行的第三字相同,依此类推。
图
唐诗幻方的GitHub页面(来源:受访者)
在遍历全唐诗的时候,一旦检测到这样的规则被破坏,即可立刻抛弃这一条搜索的路径,跳到下一个分支。
比如:目前假设第一句是“菡萏发荷花”,他发现“萏”字不存在单独作为某句诗第一字的情况,所以就不必再搜索以“菡萏发荷花”为第一句的可能答案了。
假设第一句选了“镜湖三百里”,发现以这五字起头的句子都有,那就再来寻找第二句,假使又遍历到“菡萏发荷花”,发现以“镜菡”“湖萏”这些开头的诗句统统不存在,那就不必再搜索以“菡萏发荷花”为第二句的答案了。
有了这些判断,搜索范围骤然减小很多,他发现在第二句的位置,99%的唐诗都被卡嚓掉了。
除此之外,他希望能快速地知道,某几个字是否可作为一句唐诗的开头。比较“天真”的算法是,把每句唐诗都与它比对,这时需要线性的时间来做这个确认。
图
全唐诗中的汉字(来源: