人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵

你能看出来,这首诗妙在哪里吗?其实,横着读是一首诗,竖着读还是这首诗!而且,这首诗可不是乱编的,其中的诗句都来自《全唐诗》,读起来也颇有意境 。创造这个奇妙组合的,不是文学研究大师,而是一位程序员小哥 。
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

他用计算机,找出了所有符合规律的古诗,还在Github上开源了代码 。
就连README文件,也颇具个性:
余所用之程序,當以gcc編譯之如是gcc -O3 mgsq5.c -o mgsq5
等一下 。这个风格好像很熟悉?
没错,这位程序员,正是之前开发了火遍全网的文言文编程语言的Huang Lingdong 。
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

△ 文言文编程的“Hello,World”
他用数学中的3阶幻方(九宫格)作比,把符合这种规律的诗命名为“唐诗幻方” 。
然而,这首诗真正的玄妙之处,还不止在这里 。
玄妙之处
这首诗,初看只是横竖都能读,但如果把其中汉字编码成数字再看的话,会发现:
原来,这是个对称矩阵!
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

不过,他遍历了全唐诗里所有五言诗共二十八万七千句后,也只能得出两个这样的幻方 。
除了“风月清江夜”以外,还只有一个,不过意境上差了许多,不能令他满意 。
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

在135600行七言唐诗中,符合这个规律的七言“幻方”,更是一个都没有 。
他只能退而求其次,只寻找奇数项对称的,即每句第1、3、5、7个字对称,偶数行用空行代替 。
放宽标准后倒是能找出不少,但再想从其中挑选符合音韵格律、意思上还通顺的,就不多了 。
最后,他选择了其中一个还稍微过得去的做例子,把空行中的字也加上,也能写成对称矩阵:
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

这位小哥,是在研究传统文化时,从古代的洛书和璇玑图中获得的灵感 。
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

△洛书
洛书写成数字就是三阶幻方,特点是每一行、每一列及对角线中的数字之和都相等 。
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

文字没有求和这种操作,如果按照程序员思维,那就是字符串拼接起来相等 。
就这样,得出了要寻找的目标:第n行和第n列的文字相同 。
璇玑图中共841个字,按顺读、逆读、横读、斜读、蛇行读、交叉读、换行读、换列读、间句读都能成诗,总共包含了7958首诗 。
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

其中的关键之处在于,按照不同顺序读,其文字都能组成有意义的诗句 。他自认没有古人作诗的才华,就想到从唐诗中寻找符合条件的诗句 。
而且是用现代人的方法——编程来解决 。
以“暴力”治之
这位小哥,先是想到了用“八皇后问题”的计算机解法,来找出符合要求的唐诗 。
八皇后问题,简单来说是这样的:
8 x 8的国际象棋棋盘上,摆放8个不同的皇后,使其不能互相攻击,即处在同一行、同一列、同一斜线上,求解摆放方法 。
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

这个问题,可以用到一种名为“回溯法”的算法来求解,原理如图:
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵
文章图片

如果用回溯法来找“幻方”,计算机需要先随机“找出半句诗”,再挨个儿往后面搜索合适的诗句 。
例如,计算机先从13万行唐诗中,随机找出诗句“风月清江夜”:
人物 那个用文言文编程的小哥 竟从28万行唐诗中找出了对称矩阵

推荐阅读