用c语言写一个唐诗的程序,文言文编程95后又出新作,在287051行古诗中找出了“唐诗幻方”!...

还记得那位用文言文编程的中国小伙吗?

图 | 文言文编程(来源:受访者)

2019 年 ,22 岁的上海小伙黄令东用文言文编程,当时他还在读大四,凭借该项目小伙子瞬间“原地出道”。

图 | 文言文编程的 HELLO WORLD(来源:受访者)

最近,他又开发出了 “唐诗幻方”。如下图所示,这二十五字横着读、竖着读都是五句唐诗。每句诗都出自唐代名家之手,如李白、高适、张祜……

图 | “唐诗幻方”(来源:受访者)

再比如下面这首,横读、竖读也都是五句唐诗,出自白居易、姚合等人的诗集。

心如七十人

如何十年間

七十未成事

十年成底事

人間事事慵

五言的诗句能组成 “幻方” 的,在《全唐诗》二十八万句中有且仅有两组。三言诗就多得多了,下面是两例:

拂秋水

秋夜長

水長東

惜春心

春歌斷

心斷絕

(来源:受访者)

再把汉字编译成数字,你会发现这是一个对称矩阵。

(来源:DeepTech 自制)

谈及为何做这样的研究,黄令东打趣称:“某一天吃得太饱,读了一点诗,就忽然有了这样的想法。”

问他做“唐诗幻方”经历了哪些步骤,他的回答依然很有趣:

1. 吃饱

2. 写代码

3. 运行

4. 睡觉

5. 醒来发现还没运行好,换个算法写一遍

6. 再运行

7. 出门兜一圈

8. 运行出来了,整合结果,发布代码

从集句角度来说,集句诗、八破图、酒令等都是古人爱玩的游戏。从文字本身的限制上来说,古人在回文诗和璇玑图上也玩得很好。

但黄令东猜测,在集句的同时、还能形成对称矩阵,估计古人玩不起来。

他认为全唐诗里估计一组也未必找得到,那究竟是不是这样呢?他用 C 语言写了 210 行代码,于是就有了“唐诗幻方”这个作品。

他认为,这个玩法和古人的文字游戏一脉相承的。只是如今我们有了计算机的辅助,可以玩难度更高的游戏。

如果由古代诗人创作这样的幻方,其实也并不特难,甚至给定第一句,后四句他也能凑出来,所以他认为本次研究更倾向是一种“由微茫概率而产生的浪漫主义”。

说到本次使用的技术,他竟然说 “没有技术”。其表示,不同于 AI 写诗这类对创作力有要求的题目,集句可以算作一个搜索问题(Search problem),这类问题其实非常经典。

甚至五十年前的程序员就能做,而黄令东写的 C 代码,在五十年前也能跑,用到的算法在五十年前也已是人类共识,非要说有什么区别,可能只是跑得更快。

对于本次研究的原理,他认为非常简单。首先提出问题,问有没有二十五个字,排成五乘以五的矩阵,横读竖读都是五句唐诗?

图 | 黄令东找出来的 259 行三字唐诗中的一部分(来源:受访者)

他解释称,这个问题最糟糕的算法是在二十五个位置上,找遍所有的汉字,以希冀某种组合可以达到要求。假设可以入诗的字有五千个,那么需要遍历五千的二十五次方个答案。用计算机界的比喻来讲,比可观测宇宙的原子还要多一百亿倍。

次糟糕的算法是,从全唐诗二十八万句五言中找出五句来排列组合,会有二十八万的五次方个可能答案。虽然比前面缩小了数十个数量级,然而依旧不现实。

但他通过观察这二十五字的规律后发现:第一句里的每个字、都必须可以作为一句的第一字;同理,第二句的每个字、和第一句中同一个位置的字连起来,都必须可以作为一句的前两个字;

同时,第二行的第一个字、必与第一行的第二字相同,第三行的第二字、必与第二行的第三字相同,依此类推。

图 | 唐诗幻方的 GitHub 页面(来源:受访者)

在遍历全唐诗的时候,一旦检测到这样的规则被破坏,即可立刻抛弃这一条搜索的路径,跳到下一个分支。

比如:目前假设第一句是 “菡萏发荷花”,他发现 “萏” 字不存在单独作为某句诗第一字的情况,所以就不必再搜索以 “菡萏发荷花” 为第一句的可能答案了。

假设第一句选了 “镜湖三百里”,发现以这五字起头的句子都有,那就再来寻找第二句,假使又遍历到 “菡萏发荷花”,发现以 “镜菡”“湖萏” 这些开头的诗句统统不存在,那就不必再搜索以 “菡萏发荷花” 为第二句的答案了。

有了这些判断,搜索范围骤然减小很多,他发现在第二句的位置,99% 的唐诗都被卡嚓掉了。

除此之外,他希望能快速地知道,某几个字是否可作为一句唐诗的开头。比较 “天真” 的算法是,把每句唐诗都与它比对,这时需要线性的时间来做这个确认。

图 | 全唐诗中的汉字(来源:https://ctext.org/quantangshi/zh)

所以他对此做了一个优化:把全唐诗每一句话的第一字、前两字、前三字、前四字,都分别存在各自的哈希集内,这样就可以近乎瞬间地查找到。

于是,在不到一小时里,他就在目前的程序中,找到全唐诗里所有的“唐诗幻方”了。不过黄令东认为,他这样的方法未必是最好的,但既然达到了他的目标,所以就暂且如此。

正如他在项目结尾所写:“余于算法颇无用意,学诗亦未特工。故所想未必为佳,其法亦未必为速。诸公有妙思者,吾谨愿闻焉。”

文言文编程大火,但从未打算商业化

2019 年底的文言文编程,是黄令东走红的代表作。他说很久以前就有做文言文编程的想法。一开始,他先写了一个阿拉伯数字转换中文的小模块作为试验,但一时没想好编程语言的语法部分,所以就在广览古籍的同时慢慢想。

后来他发现书看得愈多,愈觉得不足,以至于拖延无期。所以不如立刻下手,即使做出来不完美,但也算是抛砖引玉的作品。当时正好期末考试,学校停课复习,所以用大把时间写出了文言文编程项目。

那时,他从未写过类似项目,也没有学过编译器原理的课程,全程都是一边摸索一边写。他用的方法是,先用文言文语言写出几个想象中合法的程序样本,然后改进编译器来使它能在样本上运行。

有时,也会发现样本中有矛盾或不合理的地方,所以文言文语言定义与其编译器是同时发展的。初始的版本可以编译至 JavaScript 和 Python 两种语言,在开源社区的贡献下支持第三种 Ruby 目标语言。

// JavaScript

var甲= 3;

for (let _rand1 = ; _rand1

var _ans1 = "问天地好在。";

console.log(_ans1);

};

# Python

甲=3

for _rand1 in range(甲):

_ans1="问天地好在。"

print(_ans1);

# Ruby

甲=3

甲.times do |_rand1|

_ans1="问天地好在。"

p([_ans1].join)

end

图 | JS 、Python 和 Ruby 三种语言的代码(来源:受访者)

文言文编程大火之后,他收到很多信件,对于该项目的商业化,他说:“我没有想过,也不想想。当时我是因为有意思而作,火是因为有很多人同样觉得有意思,从而激发了他们的思考、辩论、贡献、和衍生的作品。这样作为一个开源项目,我觉得挺好。古今从事创作而得到乐趣的人,我想大抵是这样一种想法。”

出生于上海,从小喜欢绘画

黄令东从小生活在上海,他说自己并不算十分努力,假使算得上优秀,都得益于环境和教育。小时候父母经常带他出国旅游,参观博物馆和画展。每周末还学习画图,结识了不少在艺术上很有见地的师友。

图 | 黄令东(来源:受访者)

高中时,他在上海世界外国语中学读 IB 课程,该课程是“国际文凭组织 IBO(International Baccalaureate Organization)是为全球学生开设的从幼儿园到大学预科的课程,旨在为 3-19 岁的学生提供智力、情感、个人发展、社会技能等方面的教育”。

课程期间,他萌发出写代码的兴趣,在卡内基梅隆大学(CMU)读书时,也得到了 该校 Golan Levin 教授的很多帮助。

刚从 CMU 毕业时,他在 CMU 的 Studio for Creative Inquiry 实验室做了一段时间研究助理。该实验室由他的老师 Golan Levin 主持,主要做跨艺术、科学、技术和文化学科的新奇研究。

图 | 黄令东的作品集(来源:受访者)

大学四年间,黄令东的很多项目都在该实验室完成。以 PEmbroider 为例,这是一个做程序刺绣(Computational embroidery)的开源框架,用户通过简单的代码操作,就能用绣花机做出相关图案。

图 | 刺绣实例(来源:受访者)

颇让人感到自豪的是,他还设计出用 AI 生产山水画的程序,并将绘制出来的画作,在 CMU 举办了一场画作展览。

图 | 电脑山水画展览(来源:受访者)

他还给 Golan Levin 的作品 Ambigrammatic Figures 编写了代码,用 GAN(生成神经网络)生成了正着、倒着都能成立的人脸。

图 | 倒立人脸作品(来源:受访者)

谈及未来,就文言文编程的优化来说,他计划用静态语言再写一个编译器,以便将其编译到 C 语言、汇编语言和 WebAssembly 语言上。针对“唐诗幻方”目前暂无新计划,可能要等他想出新的游戏规则,才做成一系列作品。

说到为何在国外做中国传统文化的作品,他的回答也很 “文言文”:“在国外推广中国文化,并非我作品全部的初衷,然而我做出的东西,能使得国内外的人同样觉得有意思,从而产生对我国文化的兴趣,那也是我极乐意见到的。”

他认为,“好的东西,根据我的观察,实在是世界上的人共通而能欣赏的,假使有所谓‘不懂’的情况,只怕是受到了个体的限制。”

-End-

参考:

https://pastebin.ubuntu.com/p/bMhgkyf7Hx/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值