点击蓝字

关注我们

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

来源于网络,侵删

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

来源:量子位(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小时就能跑出所有的“对称诗”。

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

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

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

戳“阅读原文”我们一起进步

文言文编程?厉害了程序员!相关推荐

  1. 有个厉害的程序员女朋友是什么体验?

    来自:51CTO技术栈(微信号:blog51cto) " 自古妇女能顶半边天,在 IT 界,女生的力量也越来越强大,杰出的女性闪耀在我们身边. 有人说: 世界上有两种程序员 一种是程序员 一 ...

  2. 如何成为很厉害的程序员?这几点很重要

    前几天我儿子问我说:"怎么成为一个很厉害的程序员?" 从我开始学编程起,我也很羡慕那些比我厉害的人,虽然偶像一直在变,但也恰恰说明了我在进步,因为慢慢地我离我羡慕的那种人越来越近, ...

  3. 编程范式,程序员的编程世界观

    编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式(Paradigm)以及编程范式等术语渐 ...

  4. 编程范式,程序员的编程世界观(转)

    编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式(Paradigm)以及编程范式等术语渐 ...

  5. 一张图告诉你,自学编程和科班程序员的差别在哪

    自学编程的程序员,似乎都处于鄙视链的底端,而计算机专业的毕业生,似乎天然存在着一种优越感.自学编程和科班程序员的差距,到底有多大?这也是即将"入坑"的编程爱好者,最关心的一个问题. ...

  6. Ruby 之父:编程要给程序员带来乐趣

    作者 | 年素清 责编 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 很多人会将编程能力和数学能力挂钩,可在一众泰斗级的计算机专家里,来自日本的松本行弘,是一位数学"学渣&quo ...

  7. 全民编程时代,程序员该如何保住饭碗?

    李开复在<人工智能>里说过:人工智能将在未来取代一半人的工作,人根本不是机器的对手,他们不喊累.不闹情绪.犯错率极低. 他提醒中国的父母,必须让孩子慎重地选择大学的专业,因为弄不好,等他们 ...

  8. 10句编程箴言 每个程序员都应该知道

    导读:原文作者Kevin Pang在kevinwilliampang.com发表一篇<10 Programming Proverbs Every Developer Should Know> ...

  9. 未来十年: 机器编程会取代程序员吗?

    2700万程序员要失业?机器编程要让全球78亿人都能写代码 英特尔的ControlFlag通过学习超过十亿行代码,可以自主检测代码中的错误. 数据显示,全球78亿人中,只有2700万人会编写代码,占比 ...

  10. 【阅读心得】Python编程无师自通——专业程序员的养成

    读书笔记: 笔者是一个稍微有点编程基础的人,学习python一开始是从吴恩达的视频入门的,但是直接套用框架,使用模块,对python的语法却不甚了解,我也试过直接去廖雪峰的python学习网站上面学习 ...

最新文章

  1. 掩码计算工具netmask
  2. 【Python金融量化 2- 100 】股票量化分析基本知识
  3. 2019年春季学期第四周作业
  4. vue人员轨迹_Vue项目(vuecli3.0搭建)集成高德地图实现路线轨迹绘制
  5. 【AD】如何将喜欢的图案导出成为丝印层和PCB形状
  6. Flex4_操作XML
  7. 软件基本功:测试先从做功能文档开始,不断积累
  8. 打飞机小游戏,附带源码
  9. 【Matlab】线性二次型最优控制问题(LQR控制)
  10. mic in和line in
  11. 保险合同中的“不可抗辩条款”
  12. 实用网址(永久更新中)
  13. Kanzi学习-待继续更新
  14. 解决帆软中不能制作城市热力图的问题
  15. matlab石碑提取,罗塞塔石碑-高尔夫代码:Tic Tac T
  16. LintCode 644. 镜像数字 JavaScript算法
  17. 中关村软件园附近美食一览
  18. 分支语句(if,switch)
  19. 记录Python selenium制作自动化农民世界脚本第一天
  20. 8021什么意思_违章代码8021是什么意思

热门文章

  1. IC工程师:百万年薪路上的20个阶段,你在哪个阶段?
  2. Android 下雪动画
  3. 摄像头参数D、H、V 分别代表的意思
  4. sqlite多进程并发读写模式下,返回SQLITE_BUSY错误的处理方法
  5. YUM下载安装包及其所有依赖包
  6. 一个文科生的工程师之路
  7. 计蒜客习题:骑车比赛
  8. 《陈二狗妖孽人生》之经典语录
  9. OPPO跨越 “挑战者深渊”
  10. DHCP Relay