太秀了!那个在 GitHub 用文言文编程的小哥,竟从 28 万行唐诗中找出了对称矩阵
来自量子位
下面这张图,你能看出来,这首诗妙在哪里吗?
其实,横着读是一首诗,竖着读还是这首诗!
而且,这首诗可不是乱编的,其中的诗句都来自《全唐诗》,读起来也颇有意境。
创造这个奇妙组合的,不是文学研究大师,而是一位程序员小哥。
他用计算机,找出了所有符合规律的古诗,还在 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/
--- EOF ---
长按进入小程序,隐藏各种黑科技(更多精彩值得期待……)
最近热文:公司能不能监控到大家的微信聊天内容?“那种资源”开头的“ FBI WARNING ”,到底是什么意思?看产品经理怎么用360实现Java垃圾回收!
骂了 10 年,微信这功能终于要来了!
12 个非常适合做外包项目的开源后台管理系统
拆解1968年的美国军用电脑,真的怀疑是“穿越”啊!2T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,人工智能,考研,软考,英语,等等。在公众号内回复「资源」,即可免费获取!回复「社群」,可以邀请你加入读者群!
❤️给个「在看」,是对我最大的支持❤️
太秀了!那个在 GitHub 用文言文编程的小哥,竟从 28 万行唐诗中找出了对称矩阵相关推荐
- 太秀了!那个在 GitHub 用文言文编程的小哥,竟从 28 万行唐诗中找出了对称矩阵...
点击上方"Github中文社区",关注 触达Github项目 来源:量子位 大家好,请看下面这张图,你能看出来,这首诗妙在哪里吗? 其实,横着读是一首诗,竖着读还是这首诗! 而且, ...
- 厉害了!那个用文言文编程的小哥,竟从28万行唐诗中找出了对称矩阵
本文经AI新媒体量子位(ID:QbitAI)授权转载,转载请联系出处 梦晨 萧箫 发自 凹非寺 你能看出来,这首诗妙在哪里吗? 其实,横着读是一首诗,竖着读还是这首诗! 而且,这首诗可不是乱编的,其中 ...
- 用计算机研究唐诗,妙哉!那个用文言文编程的小哥,竟从28万行唐诗中找出了对称矩阵...
梦晨 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你能看出来,这首诗妙在哪里吗? 其实,横着读是一首诗,竖着读还是这首诗! 而且,这首诗可不是乱编的,其中的诗句都来自<全唐诗&g ...
- 怎样用文言文优雅地装逼!28万行唐诗中找出对称矩阵
梦晨 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你能看出来,这首诗妙在哪里吗? 其实,横着读是一首诗,竖着读还是这首诗! 而且,这首诗可不是乱编的,其中的诗句都来自<全唐诗&g ...
- 用c语言写一个唐诗的程序,文言文编程95后又出新作,在287051行古诗中找出了“唐诗幻方”!...
还记得那位用文言文编程的中国小伙吗? 图 | 文言文编程(来源:受访者) 2019 年 ,22 岁的上海小伙黄令东用文言文编程,当时他还在读大四,凭借该项目小伙子瞬间"原地出道". ...
- GitHub火热!程序员小哥不得不知的所有定律法则(附项目链接)
来源:机器之心 本文约3000字,建议阅读5分钟. 本文介绍了最近 GitHub 上很火的"定律合集"项目. 当谈到开发问题时,人们总会谈论各种定律.但对于大多数人来说,总有一些是 ...
- 文言文编程?厉害了程序员!
点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 你能看出来,这首诗妙在哪里吗? 来源:量子位(ID ...
- Excel批量合并相同内容单元格操作——WPS太秀了
昨儿我整理了一篇OFFICE批量化合并相同单元格的博文,觉得好棒棒,结果下午的发现, WPS居然把这个操作集成成工具了...太秀了呀,给国产良心软件点个赞不过分吧.废话不多说看效果. 待 ...
- 太秀了!用Excel也能实现和Python数据分析一样的功能!
作者:Cherich_sun 来源:公众号「杰哥的IT之旅」ID:Jake_Internet 太秀了!用Excel也能实现和Python数据分析一样的功能! 这是一篇关于如何用excel做数据分析的案 ...
最新文章
- Python实战案例,pygame模块,Python实现套路表白神器VS无套路表白神器
- hdu1.3.5 排列2
- 祝各位节日快乐!20151111
- 【ORACLE 高可用】 作业 :配置ORACLE GoldenGate 1
- vmware创建虚拟机并安装centos7系统
- 【算法分析与设计】快速排序
- android开发:input类型
- 【bzoj2929】[Poi1999]洞穴攀行 网络流最大流
- openresty的安装和使用
- Linux(Ubuntu)常用命令(五)—— vi/vim常用操作
- pageHelper 分页插件使用
- java软件开发是什么_java常用的开发软件是什么
- Vue开发历程---音乐播放器
- 致童年,那些年我们逝去的岁月
- Linux自学笔记——OpenSSL命令行工具
- 六成受访美国人认为教育系统正在令这一代人失望
- python中for循环的代码_Python中的九九乘法表(for循环)
- php 正则 括号内容_PHP怎么实现正则匹配所有括号中的内容
- 分布式服务框架HSF学习 Dubbo VS HSF
- ROS学习笔记之导航(仿真)
热门文章
- 计算机毕业设计ssm大学生科技活动报名系统2h1ir系统+程序+源码+lw+远程部署
- android 音量调节框,「Best Volume Widget」手机桌面独立音量调节小工具 (Android)...
- 单片机串口通讯RXD与TXD如何对接详解(独家!)
- 山地自行车系统的组成部分及论如何自己组装一台山地车
- 为什么每个女生都比较避讳别人问年龄问题?于是我偷偷写了一款年龄检测器,公司同事的年龄都被我知道了~
- Matlab坐标轴标注和特殊字体
- python 获取Jenkins job数据
- 代付业务-受托代付、委托代付
- R语言:reshape2包里的melt()、dcast()、acast()函数学习
- 百度android 升级,百度浏览器app下载_百度浏览器v6.4.21安卓去广告去升级版-这家软件站...