热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用计算机研究唐诗,妙哉,那个用文言文编程的小哥,竟从28万行唐诗中找出了对称矩阵...

编者按:本文来自微信公众号“量子位”(ID:QbitAI),作者:梦晨萧箫,36氪经授权发布。你能看出来,这首

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

你能看出来,这首诗妙在哪里吗?

97feb9a8beef81b19310da3108099aa1.png

其实,横着读是一首诗,竖着读还是这首诗!

2e0e25fbc026307331dfa0a4b3b03ac1.png

而且,这首诗可不是乱编的,其中的诗句都来自《全唐诗》,读起来也颇有意境。

创造这个奇妙组合的,不是文学研究大师,而是一位程序员小哥。

他用计算机,找出了所有符合规律的古诗,还在Github上开源了代码。

就连README文件,也颇具个性:

余所用之程序,當以gcc編譯之如是gcc -O3 mgsq5.c -o mgsq5

等一下。这个风格好像很熟悉?

没错,这位程序员,正是之前开发了火遍全网的文言文编程语言的Huang Lingdong。

4e34de292da9b60e6d8b331d4bbbe727.png

△ 文言文编程的“Hello,World”

他用数学中的3阶幻方(九宫格)作比,把符合这种规律的诗命名为“唐诗幻方”。

然而,这首诗真正的玄妙之处,还不止在这里。

玄妙之处

这首诗,初看只是横竖都能读,但如果把其中汉字编码成数字再看的话,会发现:

原来,这是个对称矩阵!

323b9ca17bce3d1aa4fa75c24da76deb.png

不过,他遍历了全唐诗里所有五言诗共二十八万七千句后,也只能得出两个这样的幻方。

除了“风月清江夜”以外,还只有一个,不过意境上差了许多,不能令他满意。

42dd6ba9e3ae6cc23dbaf1b6524a6782.png

在135600行七言唐诗中,符合这个规律的七言“幻方”,更是一个都没有。

他只能退而求其次,只寻找奇数项对称的,即每句第1、3、5、7个字对称,偶数行用空行代替。

放宽标准后倒是能找出不少,但再想从其中挑选符合音韵格律、意思上还通顺的,就不多了。

最后,他选择了其中一个还稍微过得去的做例子,把空行中的字也加上,也能写成对称矩阵:

c4ffc9a5523837b373aa4e72c15b8acb.png

这位小哥,是在研究传统文化时,从古代的洛书和璇玑图中获得的灵感。

ba9edb74418c9dd82385b2e724c0c9f8.png

△洛书

洛书写成数字就是三阶幻方,特点是每一行、每一列及对角线中的数字之和都相等。

797cee5de28b2e2cb3055bbeea7c0dde.png

文字没有求和这种操作,如果按照程序员思维,那就是字符串拼接起来相等。

就这样,得出了要寻找的目标:第n行和第n列的文字相同。

璇玑图中共841个字,按顺读、逆读、横读、斜读、蛇行读、交叉读、换行读、换列读、间句读都能成诗,总共包含了7958首诗。

a86d149b94a797afd7f0a17b35cf2df8.png

其中的关键之处在于,按照不同顺序读,其文字都能组成有意义的诗句。他自认没有古人作诗的才华,就想到从唐诗中寻找符合条件的诗句。

而且是用现代人的方法——编程来解决。

以“暴力”治之

这位小哥,先是想到了用“八皇后问题”的计算机解法,来找出符合要求的唐诗。

八皇后问题,简单来说是这样的:

8×8的国际象棋棋盘上,摆放8个不同的皇后,使其不能互相攻击,即处在同一行、同一列、同一斜线上,求解摆放方法。

14cbb8846be3026697cb8955e2cd3295.png

这个问题,可以用到一种名为“回溯法”的算法来求解,原理如图:

8c10a4db05d644842920c97233cc31c2.png

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

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

9c3629471c79fc190862145635063295.png

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

e807c16627fbe8420b846e81044e3594.png

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

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

b1b6cd1937f6caea0ee4a1a101deeac2.png

(以清夜开头的诗句,就少了许多)

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

8bac2098b5768d19fc3e511e1ff246df.png

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

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

2be2d05ef8660f61fae950884682a27f.png

难度逐渐变成地狱级……

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

这样的话,最初的第一步,就显得尤为重要:从什么类型的诗句开始遍历,才能最快地找到答案?

他为此用上了启发式搜索,从已知问题信息入手,对这些空格进行评估,找到限制条件最多、即最容易“下笔”的那个位置,再从这个位置开始找诗。

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

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

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

896fface629e32d08c4a40dbe16a9381.png

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

然而在运行代码时,作者却发现,这样做效率并不高。

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

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

1f5e21c48580d2ad5c4f26d807b09ab9.png

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

如果没有找到最初那个合适的字,往往搜到一半后,能用的诗句就没了,又得重新再猜,效率不升反降。

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

c1ca33a81295860d61f5e9c12c0c73a3.gif

当然,也不是普通的暴力搜索。

会有两个搜索条件:

其一,以五言诗为例,第五列的前4个字,和第五行的前4个字,内容是否完全一样?如果不一样,就扔掉。

55667cdaeb1902d18f59818ae9f96acd.png

△ 第五行和第五列的前4个字

其二,这首诗是不是对称矩阵?不是的话,就扔掉。

1755c84889ca75cb57ff8d62b68562e6.png

利用C语言写好后,不用1小时就能跑出所有的“对称诗”。

作者表示,自己并非文学研究的专家,也不是算法专家,因此,这种方法可能并不是最好的办法。

诸君若有更好的求解思路,可以来找他玩耍~

作者介绍

f90eea1df627f7f608491877d92c2ab3.png

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

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

还能通过机器学习分析用户作品,并与《全唐诗》中的诗句做比对,看你写的诗像哪位诗人的风格。

d999d51cd6acf301985164ecaeb808f8.png

除了诗词古文,他对传统美术也颇有研究,开发过无限生成随机山水画的工具,和多款中文字体。

dece57afecd319342a9a20fc5eca4b52.png

△就是不知道为什么山水画里有个电线杆

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

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



推荐阅读
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
author-avatar
CHANBunCHAI
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有