转载:本文来自微信公众号“量子位”(ID:QbitAI),作者:梦晨 萧箫,转载经授权发布。
你能睇出来,这首诗妙在边入面吗?
其实,横住读是一首诗,竖住读还是这首诗!
而且,这首诗可唔系乱编嘅,其中嘅诗句都来自《全唐诗》,读起来都颇有意境。
创造呢个奇妙组合嘅,唔系文学研究大师,而是一位程序员小哥。
佢用计算机,找出所有符合规律嘅古诗,仲喺度Github上开源代码。
就连README文件,都颇具个性:
余所用之程序,當以gcc編譯之如是gcc -O3 mgsq5.c -o mgsq5
等一下。呢个风格好像好熟悉?
没错,这位程序员,正是之前开发火遍全网嘅文言文编程语言嘅Huang Lingdong。
△ 文言文编程嘅“Hello,World”
佢用数学中嘅3阶幻方(九宫格)作比,将符合呢种规律嘅诗命名为“唐诗幻方”。
但係,这首诗真正嘅玄妙之处,仲未止在这入面。
玄妙之处
这首诗,初睇只是横竖都可以读,但如果将其中汉字编码成数字再睇嘅话,会发现:
原来,这是个对称矩阵!
不过,佢遍历全唐诗入面所有五言诗共二十八万七千句后,都只能得出两个咁样嘅幻方。
除咗“风月清江夜”以外,仲要只有一个,不过意境上差好多,唔可以令佢满意。
在135600行七言唐诗度,符合呢个规律嘅七言“幻方”,更是一个都没有。
佢只能退而求其次,只寻找奇数项对称嘅,即每句第1、3、5、7个字对话,偶数行用空行代替。
放宽标准后倒是能找出不少,但再想从其中挑选符合音韵格律、意思上还通顺嘅,就不多嘎啦。
最后,佢选择其中一个还稍微过得去嘅做例子,将空行中嘅字都加上,都可以写成对称矩阵:
这位小哥,是在研究传统文化时,从古代嘅洛书同璇玑图中获得嘅灵感。
△洛书
洛书写成数字就是三阶幻方,特点是每一行、每一列及对角线中嘅数字之同都相等。
文字没有求同呢种操作,如果按照程序员思维,噉就是字符串拼接起来相等。
就咁样,得出要寻找嘅目标:第n行同第n列嘅文字相同。
璇玑图中共841个字,按顺读、逆读、横读、斜读、蛇行读、交叉读、换行读、换列读、间句读都可以成诗,总共包含7958首诗。
其中嘅关键之处在于,按照不同顺序读,其文字都可以组成有意义嘅诗句。佢自认没有古人作诗嘅才华,就想到从唐诗中寻找符合条件嘅诗句。
而且是用现代人嘅方法——编程来解决。
以“暴力”治之
这位小哥,先系想到用“八皇后问题”嘅计算机解法,来找出符合要求嘅唐诗。
八皇后问题,简单嚟讲是咁样嘅:
8×8嘅国际象棋棋盘上,摆放8个不同嘅皇后,使其唔可以互相攻击,即处在同一行、同一列、同一斜线上,求解摆放方法。
呢个问题,但系以用到一种名为“回溯法”嘅算法来求解,原理如图:
如果用回溯法来找“幻方”,计算机需要先随机“找出半句诗”,再挨个儿往后面搜索合适嘅诗句。
例如,计算机先从13万行唐诗度,随机找出诗句“风月清江夜”:
根据对称矩阵嘅原理,第二句诗嘅开头,就应该以“月”为首:
(以月开头嘅诗句,应该还是有不少嘅,像月上柳梢头)
以此类推,第三句诗嘅开头,就应该以“清夜”为首:
(以清夜开头嘅诗句,就少好多)
而第四句诗嘅开头,就应该以“江山归”打头:
(江山归开头嘅诗……可选范围应该更少)
最后一句诗嘅开头,就必须同前4句诗嘅结尾完全一致,“夜深来客”:
难度逐渐变成地狱级……
在这几步操作度,要是有任何一步无办法满足条件,就得全部推倒重来。
咁样嘅话,最初嘅第一步,就显得尤为重要:从乜嘢类型嘅诗句开始遍历,先能最快地揾到答案?
佢为此用上启发式搜索,从已知问题信息入手,对呢啲空格进行评估,揾到限制条件最多、即最容易“下笔”嘅嗰个位置,再从呢个位置开始找诗。
具体写成代码求解嘅话,就是利用递归法嘅结构。
同时,用上剪枝法,缩小剩下位置嘅查找范围。
都就是说,要用到约束函数,喺扩展节点处剪去不满足约束条件嘅子树;再用限界函数,剪去得不到最优解嘅子树。
咁样一来,就能降低问题复杂度。
但係在运行代码时,作者却发现,咁样做效率并唔高。
呢种方法,虽然可以求解“N”皇后问题,却不太适合求汉字矩阵。
因为,要填进格子入面嘅,但系不止8个皇后,每一格可以填嘅汉字,就有5000+种选择!
采用递归法嘅话,计算机在填上前面嘅汉字时,实际上就缩小剩下汉字可以搜查嘅范围。
如果没有揾到最初嗰个合适嘅字,往往搜到一半后,能用嘅诗句就没嘎啦,又得重新再猜,效率不升反降。
越想越烦躁,这位小哥干脆一拍大脾:不如暴力搜索!
当然,都唔系普通嘅暴力搜索。
会有两个搜索条件:
其一,以五言诗为例,第五列嘅前4个字,同第五行嘅前4个字,内容系咪完全一样?如果不一样,就扔掉。
△ 第五行同第五列嘅前4个字
其二,这首诗是唔系对称矩阵?唔系嘅话,就扔掉。
利用C语言写好后,不用1个钟头就能跑出所有嘅“对称诗”。
作者表示,自己并非文学研究嘅专家,都唔系算法专家,因此,呢种方法可能并唔系最好嘅办法。
诸君若有更好嘅求解思路,但系以来找佢玩耍~
作者介绍
作者Huang Lingdong,喺发布文言文编程语言时仲喺度卡耐基梅隆大学上本科。而家已毕业,喺母校嘅Studio for Creative Inquiry做研究助理,为博物馆同学校等组织开发交互媒体项目。
这位小哥热爱编程同传统文化,仲要开发过写诗IDE,能自动检查平仄等格律规则,内置韵书同康熙字典做参考。
仲可以通过机器学习分析用户作品,并同《全唐诗》中嘅诗句做比对,睇你写嘅诗像边位诗人嘅风格。
除咗诗词古文,佢对传统美术都颇有研究,开发过无限生成随机山水画嘅工具,同多款中文字体。
△就是不知道点解山水画入面有个电线杆
项目地址:https://github.com/LingDong-/magic-square-poems
Huang Lingdong主页:https://lingdong.works/
cantonese.live 足跡 粵字翻譯
2021-03-29 19:06:47
请登录之后再进行评论