文言文编程?厉害了程序员!

点击蓝字

8a587e47b379aa67c32b4b651ccc9f3c.png

关注我们

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

来源于网络,侵删

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

fe22455021cf27a67a952331c08ac1df.png

来源:量子位(ID:QbitAI),梦晨 萧箫 发自 凹非寺

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

1346ee43dde95d8b98e852be908527b6.png

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

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

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

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

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

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

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

0f56dc2e20b88175b21ab4a0168b3745.png
 文言文编程的“Hello,World”

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

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

玄妙之处

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

原来,这是个对称矩阵

bdc00564321b11125c6177f346005d34.png

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

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

ed91511b2f1df42f1ee43ac17e68751e.png

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

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

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

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

8200304b51570184d839d3b0b671dd46.png

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

86b27f15fc615613ff7ebe5e36af8bd5.png
洛书

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

664b32823cd4845ccc821792bf053bee.png

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

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

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

915812028a5b2a112166fb54c2b704d0.png

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

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

以“暴力”治之

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

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

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

b69475509f392c8944667c55faebcda0.png

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

e04140dfc02ca1254b445b69e721b30d.png

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

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

ecc81070abb68906303b8c6abaebc1a3.png

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

b2bbdac51deac1f8ea160121468ab6b9.png

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

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

e91695f7c5ec0db4e8d32764001bc797.png

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

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

0b68921f45f866c360436b7700cb4771.png

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

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

8860d6d490cf0e834af557d0bde3c90d.png

难度逐渐变成地狱级……

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

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

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

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

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

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

58d9956c19949035ee51a8562475834a.png

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

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

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

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

e4292f985468d543e0cafefe2ccc6727.png

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

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

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

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

会有两个搜索条件:

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

5ebfcb293990de483eaa072d6fc02fa4.jpeg
 第五行和第五列的前4个字

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

0be3bf0c7a26afababdf76a078f06edb.png

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

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

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

989581dfa8cd513b0fdb123dc2b72d2d.gif

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sublime快捷键代码对齐_Python配置sublime运行环境

1、下载安装python和sublime,不再赘述,官网即可下载;2、打开subilme,打开Tools > Build System > New Build System..3、点击New Build System后,会生成一个空配置文件,在这个配置文件内覆盖配置信息…

C语言贪心算法

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删01基本概念贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,…

C++最佳实践 | 可维护性

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C最佳实践:1. 工具2. 代码风格3. 安全性4. 可维护性(本文)5. 可移植性及多线程6. 性能7. 正确性和脚本可维护性避免使用编…

springboot启动自动关闭_App自动化测试用例格式和App的启动与关闭

【一】基本的用例格式这里使用unittest测试框架来编写用例。注:unittest可以提供用例的组织和管理、预期结果验证、批量化运行、产生测试报告等功能。新建一个calculator的python package,新建一个calculator_test.py,导入以下包。按照标准的…

C++最佳实践 | 可移植性及多线程

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C最佳实践:1. 工具2. 代码风格3. 安全性4. 可维护性5. 可移植性及多线程(本文)6. 性能7. 正确性和脚本可移植性明确使用的…

eap aka_使用API​​密钥(aka身份验证令牌)部署到Maven Central

eap aka如何在不使用未加密本地密码的情况下与Maven Central / Nexus通信(尤其是使用Gradle,但不仅限于此)。 基本原理 不幸的是,Gradle(和许多其他构建工具)没有提供任何机制来本地加密密码(或…

万维网发布服务 w3svc 已停止 除非万维_万维网和互联网的区别

常见的一个误解是,人们认为互联网(Internet,也叫因特网)和万维网(World Wide Web)是同样的事物。一些词语如“互联网”、“万维网”,“网”和“网络”经常可以交替使用。但是,从技术的角度来说,“互联网”和“万维网”是两个独立的…

C/C++项目开发:通讯录管理系统源码,C语言链表实现

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删hello,各位小伙伴们大家好!你们今天有敲代码嘛?如果有熟悉的小伙伴看到我,就知道又可以来学习源码…

javafx窗体程序_JavaFX真实世界应用程序:欧洲电视网广播联盟

javafx窗体程序我荣幸地与今年在德累斯顿Saxonia 系统公司工作的Alexander Casall一起在JavaOne上展示了多个JavaFX Real-World应用程序。 在准备本次演讲时,我们向客户和合作伙伴发送了一份调查表,并向他们询问了一些与他们的项目,他们的应用…

spring 数据库 链接db2_Druid,Java语言中最好的数据库连接池

Druid是Java语言中最好的数据库连接池,这话不是我说的,是Druid官方文档自己这样描述的,这是何等的自信!连接池的作用,跟线程池的作用大同小异,都是为了减少频繁的创建销毁连接IO,提升性能。drui…

编程知识:既然已经有数组了,为什么还要链表?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删对于不少开发者而言,链表(linked list)这种数据结构既熟悉又陌生,熟悉是因为它确实是非常基础的数据结构,陌生…

jcache_随机JCache内容:多个提供程序和JMX Bean

jcacheJCache(JSR 107)是用于缓存的Java标准…足够了。 没有更多介绍性的东西。 这是一则速成文章,内容涉及 多个JCache提供程序配置,以及 功能:通过JMX Mbeans的JCache统计信息 管理多个JCache提供程序 如果您只使…

python webbrowser点击_用 Python 实现手机自动答题,这下百万答题游戏谁也玩不过我!...

引言如果谈到这几年手机上各平台最常见的引流福利,必然是答题赢大奖系列小游戏了。像什么头号英雄,百万玩家之类的,充斥在我们生活中,同时也成为了我们生活中常见的娱乐方式。但是有时候就会想,能不能实现手机自动答题…

程序员的年终总结,各种版本各种残

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删朱自清版这几天心里颇不宁静了,眼看上线的日子越来越临近,而项目Bug之多,密密的交叉着,却无从改起…

securecrt哪个版本好用_电脑跑分测试软件哪个好?好用的电脑跑分软件推荐

想要直观的了解自己电脑状况,那么一款好用的电脑跑分软件无疑是必不可少的,毕竟他能够将测试结果用跑分的形式计算出来。那么,电脑跑分软件哪个比较好呢?下面是小编分享的好用的电脑跑分软件推荐,游戏玩家们可不要错过…

C语言,单片机绕不过的坎,你对C语言内存分配了解多少呢

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删一、static在C语言里面可以用来修饰变量,也可以用来修饰函数。1、 先看用来修饰变量的时候。变量在C语言里面可分为存在全局数据区、…

内存 增量数据持久_内存中数据模型和大数据持久性

内存 增量数据持久ORM框架在需要与关系数据库进行交互时可以帮助开发人员。 对于关系数据库,有许多出色的ORM框架,例如Hibernate和Apache OpenJPA,其中一些确实很棒。 如今,大数据正在涌现,越来越多的人开发在大数据上…

自学编程的6个技巧总结

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删有一天,我的一个在学编程的朋友问我:“我想快速学习编程,你有什么好的推荐吗?”我曾在上大学的时…

C语言如何知自身函数的实际地址与大小

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删事情的起因大概是这样……在很久很久以前,我最早用的是MASM(Win32ASM)写程序,从平台兼容性、开发…

xtext_使用Xtext为Eclipse和IntelliJ开发DSL

xtext在这篇文章中,我们将看到如何开发一种简单的语言。 我们的目标是: 语言的解析器 IntelliJ的编辑器 。 编辑器应具有语法突出显示,验证和自动完成功能 我们还将免费提供Eclipse和Web编辑器的编辑器 ,但请包含您的兴奋之处&…