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

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

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/

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

  1. 详解【java实现】编写一个程序,从键盘读入一段英文(多行),找出其中所有的英文单词,统计每个单词出现的次数,并按照单词出现次数由大到小排序后输出。

    题目: 编写一个程序,从键盘读入一段英文(多行),找出其中所有的英文单词,统计每个单词出现的次数,并按照单词出现次数由大到小排序后输出. 前言: "统计每个单词出现的次数,并且按照由大到小排 ...

  2. 用C语言写一个球的程序,12个球的程序.....

    12个球的程序..... 微软的一道题目...上班很无聊 写来玩玩 有12个外表一模一样的小球,其中有一个的质量和其他11个球不一样(11个球的质量完全相同),而且该球不知道是轻点还是重点.现在给你一 ...

  3. 用c语言写一个求和的程序,C语言实现两数求和

    能够使一个正确的C语言程序执行的必要顺序:上机输入与编辑源程序(.c)-->对源程序进行编译(.obj),得到目标函数-->将目标程序 与库函数链接,得到可执行的目标程序(.exe)--& ...

  4. 用c语言写一个两线程程序,如何用C语言实现多线程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...

  5. C语言编程编制职工档案管理程序,C语言 编写一个职工档案程序.doc

    C语言 编写一个职工档案程序 一.实验项目: 实验6 课程设计 (时间安排:6课时) 二.实验内容: 编写一个职工档案程序,设计实现如下功能: 建立一个职工数据结构,结构包含姓名.序号.性别和年龄信息 ...

  6. 用JAVA写一个画图小程序(JAVA 大作业)

    第一次写博客 且是稍微大点的程序 看看就行 重新写的在这,更加清晰明了:点击进入:用JAVA写一个画图小程序(JAVA 大作业)重排版本 设计思路 首先我直接去了Windows自带画图程序去实践模拟, ...

  7. 用C语言写一个计算器

    用C语言写一个计算器,除了四则混合运算之外,还支持三角函数和绝对值等函数. PS E:\Code\PL\calc> .\a.exe abs(3*5-4^2) abs(3*5-4^2)=1.000 ...

  8. c语言编写对答机器人_来,你也可以用 C 语言写一个聊天机器人

    来,你也可以用 C 语言写一个聊天机器人 你是不是一直在面对着枯燥的 C 语言特性.摸索着前人写过的各种算法,不是因为自己的兴趣,而是依靠自身的毅力,学得很苦吧. 好吧,我们找一个好玩一点的东西,一起 ...

  9. ChatGPT实现用C语言写一个扫雷小游戏

    前几天我们利用 ChatGPT实现用C语言写一个学生成绩管理系统 其过程用时不到30秒,速度惊人 今天又让ChatGPT用C语言写了一个扫雷小游戏,它的回答是:抱歉,我是AI语言模型,无法编写程序. ...

最新文章

  1. matlab如何判断线性相关,Fisher线性判断之matlab实现
  2. 基于完成端口的文件传输设计
  3. AngularJS之Directive(三)
  4. 微信小程序使用函数的方法
  5. java opencv 平移_Java中使用opencv
  6. iptables01
  7. Android 性能优化----(3)内存优化指南
  8. [幽默漫画]对于程序猿来说deadline很容易搞定!
  9. vdbench 参数详解
  10. 推荐三款重复文件查找利器
  11. 极致体验,揭晓抖音背后的音视频技术
  12. Java手机游戏新流星蝴蝶剑,网页最好玩的游戏
  13. 物联网毕设(智能灌溉系统 -- Android端)
  14. PHP5.x时差问题
  15. SM2加解密、签名验签
  16. UiPath:Windows计划任务调度UiPath(直接调用及.bat方式)
  17. 《Spring Boot 实战派》--13.集成NoSQL数据库,实现Elasticsearch和Solr搜索引擎
  18. BeanDefinition 属性详解
  19. IBC算法之SM9简介
  20. 零起点魔兽争霸3UI布局编辑器 预览版

热门文章

  1. java 命令 线程栈_JVM调试常用命令——jstack命令与Java线程栈(1)
  2. c语言图像羽化,C图像边缘羽化
  3. Java:用户输入矩形的长和宽,使用带返回值的方法求该矩形的面积并输出
  4. C语言实验六 一维数组程序设计
  5. 矩阵与矩阵的乘法运算
  6. vb.net操作数据库之ACCESS(3)
  7. local class incompatible: stream classdesc serialVersionUID = 4696092613551164015, local
  8. 官方代付系统/支付宝微信代付/企业付款/提现秒到
  9. 网站SEO优化几个月才有效果?
  10. 制造业信息化的长治久安之计--Agentflow解决方案简介