• 简中
    • 繁中
  • 注册
  • 查看作者
  • 妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    转载:本文来自微信公众号“量子位”(ID:QbitAI),作者:梦晨 萧箫,转载经授权发布。

    你能睇出来,这首诗妙在边入面吗?

    妙哉,嗰个用文言文编程嘅小哥,竟从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×8嘅国际象棋棋盘上,摆放8个不同嘅皇后,使其唔可以互相攻击,即处在同一行、同一列、同一斜线上,求解摆放方法。

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    呢个问题,但系以用到一种名为“回溯法”嘅算法来求解,原理如图:

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    如果用回溯法来找“幻方”,计算机需要先随机“找出半句诗”,再挨个儿往后面搜索合适嘅诗句。

    例如,计算机先从13万行唐诗度,随机找出诗句“风月清江夜”:

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    根据对称矩阵嘅原理,第二句诗嘅开头,就应该以“月”为首:

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    (以月开头嘅诗句,应该还是有不少嘅,像月上柳梢头)

    以此类推,第三句诗嘅开头,就应该以“清夜”为首:

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    (以清夜开头嘅诗句,就少‌好多)

    而第四句诗嘅开头,就应该以“江山归”打头:

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    (江山归开头嘅诗……可选范围应该更少‌)

    最后一句诗嘅开头,就必须同前4句诗嘅结尾完全一致,“夜深来客”:

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    难度逐渐变成地狱级……

    在这几步操作度,要是有任何一步无办法满足条件,就得全部推倒重来。

    咁样嘅话,最初嘅第一步,就显得尤为重要:从乜嘢类型嘅诗句开始遍历,先能最快地揾到答案?

    佢为此用上‌启发式搜索,从已知问题信息入手,对呢啲空格进行评估,揾到限制条件最多、即最容易“下笔”嘅嗰个位置,再从呢个位置开始找诗。

    具体写成代码求解嘅话,就是利用递归法嘅结构。

    同时,用上剪枝法,缩小剩下位置嘅查找范围。

    都就是说,要用到约束函数,喺扩展节点处剪去不满足约束条件嘅子树;再用限界函数,剪去得不到最优解嘅子树。

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    咁样一来,就能降低问题复杂度。

    但係在运行代码时,作者却发现,咁样做效率并唔高。

    呢种方法,虽然可以求解“N”皇后问题,却不太适合求汉字矩阵。

    因为,要填进格子入面嘅,但系不止8个皇后,每一格可以填嘅汉字,就有5000+种选择!

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    采用递归法嘅话,计算机在填上前面嘅汉字时,实际上就缩小‌剩下汉字可以搜查嘅范围。

    如果没有揾到最初嗰个合适嘅字,往往搜到一半后,能用嘅诗句就没嘎啦,又得重新再猜,效率不升反降。

    越想越烦躁,这位小哥干脆一拍大脾:不如暴力搜索!

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    当然,都唔系普通嘅暴力搜索。

    会有两个搜索条件:

    其一,以五言诗为例,第五列嘅前4个字,同第五行嘅前4个字,内容系咪完全一样?如果不一样,就扔掉。

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    △ 第五行同第五列嘅前4个字

    其二,这首诗是唔系对称矩阵?唔系嘅话,就扔掉。

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    利用C语言写好后,不用1个钟头就能跑出所有嘅“对称诗”。

    作者表示,自己并非文学研究嘅专家,都唔系算法专家,因此,呢种方法可能并唔系最好嘅办法。

    诸君若有更好嘅求解思路,但系以来找佢玩耍~

    作者介绍

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    作者Huang Lingdong,喺发布文言文编程语言时仲喺度卡耐基梅隆大学上本科。而家已毕业,喺母校嘅Studio for Creative Inquiry做研究助理,为博物馆同学校等组织开发交互媒体项目。

    这位小哥热爱编程同传统文化,仲要开发过写诗IDE,能自动检查平仄等格律规则,内置韵书同康熙字典做参考。

    仲可以通过机器学习分析用户作品,并同《全唐诗》中嘅诗句做比对,睇你写嘅诗像边位诗人嘅风格。

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    除咗诗词古文,佢对传统美术都颇有研究,开发过无限生成随机山水画嘅工具,同多款中文字体。

    妙哉,嗰个用文言文编程嘅小哥,竟从28万行唐诗中找出‌对称矩阵

    △就是不知道点解山水画入面有个电线杆

    项目地址:https://github.com/LingDong-/magic-square-poems

    Huang Lingdong主页:https://lingdong.works/

    cantonese.live 足跡 粵字翻譯

    2021-03-29 19:06:47

  • 0
  • 0
  • 0
  • 172
  • 请登录之后再进行评论

    登录
  • 任务
  • 发布
  • 偏好设置
  • 单栏布局 侧栏位置: