首頁/ 歷史/ 正文

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

還記得那位用文言文程式設計的中國小夥嗎?

圖 | 文言文程式設計(來源:受訪者)

2019 年 ,22 歲的上海小夥黃令東用文言文程式設計,當時他還在讀大四,憑藉該專案小夥子瞬間“原地出道”。

圖 | 文言文程式設計的 HELLO WORLD(來源:受訪者)

最近,他又開發出了 “唐詩幻方”。

如下圖所示,這二十五字橫著讀、豎著讀都是五句唐詩。每句詩都出自唐代名家之手,如李白、高適、張祜……

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

圖 | “唐詩幻方”(來源:受訪者)

再比如下面這首,橫讀、豎讀也都是五句唐詩,出自白居易、姚合等人的詩集。

心如七十人

如何十年間

七十未成事

十年成底事

人間事事慵

五言的詩句能組成 “幻方” 的,在《全唐詩》二十八萬句中有且僅有兩組。三言詩就多得多了,下面是兩例:

拂秋水

秋夜長

水長東

惜春心

春歌斷

心斷絕

(來源:受訪者)

再把漢字編譯成數字,你會發現這是一個對稱矩陣。

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

(來源:DeepTech 自制)

談及為何做這樣的研究,黃令東打趣稱:“某一天吃得太飽,讀了一點詩,就忽然有了這樣的想法。”

問他做“唐詩幻方”經歷了哪些步驟,他的回答依然很有趣:

1。 吃飽

2。 寫程式碼

3。 執行

4。 睡覺

5。 醒來發現還沒執行好,換個演算法寫一遍

6。 再執行

7。 出門兜一圈

8。 執行出來了,整合結果,釋出程式碼

從集句角度來說,集句詩、八破圖、酒令等都是古人愛玩的遊戲。從文字本身的限制上來說,古人在迴文詩和璇璣圖上也玩得很好。

但黃令東猜測,在集句的同時、還能形成對稱矩陣,估計古人玩不起來。

他認為全唐詩裡估計一組也未必找得到,那究竟是不是這樣呢?他用 C 語言寫了 210 行程式碼,於是就有了“唐詩幻方”這個作品。

他認為,這個玩法和古人的文字遊戲一脈相承的。只是如今我們有了計算機的輔助,可以玩難度更高的遊戲。

如果由古代詩人創作這樣的幻方,其實也並不特難,甚至給定第一句,後四句他也能湊出來,所以他認為本次研究更傾向是一種“由微茫機率而產生的浪漫主義”。

說到本次使用的技術,他竟然說 “沒有技術”。其表示,不同於 AI 寫詩這類對創作力有要求的題目,集句可以算作一個搜尋問題(Search problem),這類問題其實非常經典。

甚至五十年前的程式設計師就能做,而黃令東寫的 C 程式碼,在五十年前也能跑,用到的演算法在五十年前也已是人類共識,非要說有什麼區別,可能只是跑得更快。

對於本次研究的原理,他認為非常簡單。首先提出問題,問有沒有二十五個字,排成五乘以五的矩陣,橫讀豎讀都是五句唐詩?

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

圖 | 黃令東找出來的 259 行三字唐詩中的一部分(來源:受訪者)

他解釋稱,這個問題最糟糕的演算法是在二十五個位置上,找遍所有的漢字,以希冀某種組合可以達到要求。假設可以入詩的字有五千個,那麼需要遍歷五千的二十五次方個答案。用計算機界的比喻來講,比可觀測宇宙的原子還要多一百億倍。

次糟糕的演算法是,從全唐詩二十八萬句五言中找出五句來排列組合,會有二十八萬的五次方個可能答案。雖然比前面縮小了數十個數量級,然而依舊不現實。

但他透過觀察這二十五字的規律後發現:第一句裡的每個字、都必須可以作為一句的第一字;同理,第二句的每個字、和第一句中同一個位置的字連起來,都必須可以作為一句的前兩個字;

同時,第二行的第一個字、必與第一行的第二字相同,第三行的第二字、必與第二行的第三字相同,依此類推。

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

圖 | 唐詩幻方的 GitHub 頁面(來源:受訪者)

在遍歷全唐詩的時候,一旦檢測到這樣的規則被破壞,即可立刻拋棄這一條搜尋的路徑,跳到下一個分支。

比如:目前假設第一句是 “菡萏發荷花”,他發現 “萏” 字不存在單獨作為某句詩第一字的情況,所以就不必再搜尋以 “菡萏發荷花” 為第一句的可能答案了。

假設第一句選了 “鏡湖三百里”,發現以這五字起頭的句子都有,那就再來尋找第二句,假使又遍歷到 “菡萏發荷花”,發現以 “鏡菡”“湖萏” 這些開頭的詩句統統不存在,那就不必再搜尋以 “菡萏發荷花” 為第二句的答案了。

有了這些判斷,搜尋範圍驟然減小很多,他發現在第二句的位置,99% 的唐詩都被卡嚓掉了。

除此之外,他希望能快速地知道,某幾個字是否可作為一句唐詩的開頭。比較 “天真” 的演算法是,把每句唐詩都與它比對,這時需要線性的時間來做這個確認。

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

圖 | 全唐詩中的漢字(來源: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 三種語言的程式碼(來源:受訪者)

文言文程式設計大火之後,他收到很多信件,對於該專案的商業化,他說:“我沒有想過,也不想想。當時我是因為有意思而作,火是因為有很多人同樣覺得有意思,從而激發了他們的思考、辯論、貢獻、和衍生的作品。

這樣作為一個開源專案,我覺得挺好。古今從事創作而得到樂趣的人,我想大抵是這樣一種想法。

出生於上海,從小喜歡繪畫

黃令東從小生活在上海,他說自己並不算十分努力,假使算得上優秀,都得益於環境和教育。小時候父母經常帶他出國旅遊,參觀博物館和畫展。每週末還學習畫圖,結識了不少在藝術上很有見地的師友。

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

圖 | 黃令東(來源:受訪者)

高中時,他在上海世界外國語中學讀 IB 課程,該課程是“國際文憑組織 IBO(International Baccalaureate Organization)是為全球學生開設的從幼兒園到大學預科的課程,旨在為 3-19 歲的學生提供智力、情感、個人發展、社會技能等方面的教育”。

課程期間,他萌發出寫程式碼的興趣,在卡內基梅隆大學(CMU)讀書時,也得到了 該校 Golan Levin 教授的很多幫助。

剛從 CMU 畢業時,他在 CMU 的 Studio for Creative Inquiry 實驗室做了一段時間研究助理。該實驗室由他的老師 Golan Levin 主持,主要做跨藝術、科學、技術和文化學科的新奇研究。

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

圖 | 黃令東的作品集(來源:受訪者)

大學四年間,黃令東的很多專案都在該實驗室完成。以 PEmbroider 為例,這是一個做程式刺繡(Computational embroidery)的開源框架,使用者透過簡單的程式碼操作,就能用繡花機做出相關圖案。

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

圖 | 刺繡例項(來源:受訪者)

頗讓人感到自豪的是,他還設計出用 AI 生產山水畫的程式,並將繪製出來的畫作,在 CMU 舉辦了一場畫作展覽。

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

圖 | 電腦山水畫展覽(來源:受訪者)

他還給 Golan Levin 的作品 Ambigrammatic Figures 編寫了程式碼,用 GAN(生成神經網路)生成了正著、倒著都能成立的人臉。

22歲文言文程式設計開發出唐詩幻方,每句都出自唐代名家之手| 推薦

圖 | 倒立人臉作品(來源:受訪者)

談及未來,就文言文程式設計的最佳化來說,他計劃用靜態語言再寫一個編譯器,以便將其編譯到 C 語言、組合語言和 WebAssembly 語言上。針對“唐詩幻方”目前暫無新計劃,可能要等他想出新的遊戲規則,才做成一系列作品。

說到為何在國外做中國傳統文化的作品,他的回答也很 “文言文”:“在國外推廣中國文化,並非我作品全部的初衷,

然而我做出的東西,能使得國內外的人同樣覺得有意思,從而產生對我國文化的興趣,那也是我極樂意見到的。”

他認為,“好的東西,根據我的觀察,實在是世界上的人共通而能欣賞的,假使有所謂‘不懂’的情況,只怕是受到了個體的限制。”

-End-

參考:

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

相關文章

頂部