本文作者Angus Croll是Twitter工程师、JavaScript迷、文学迷,并且非常喜欢作家海明威。他在梦中"梦见"一些名人编写JavaScript代码,不同的作家呈现出各种编程风格,大家不妨一起来品尝下。

下面是对原文的摘译。

  最近,我做了一个梦,我请海明威和其他四位文学名人替我编写JavaScript代码,一个函数返回一个给定长度的斐波纳契数列。有趣地是,他们每个人都以不同的方式完成了这一题,并且都做的很好——只是我想说,每个解决方案工作起来都好比广告(即使是Andre Breton的),后来我又请包括海明威在内的7名文豪用JavaScript来编写阶乘,似乎一切都那么神奇,但他们都成功地完成了,大家不妨来看看结果吧。

一、实现斐波纳契数列

  1.欧内斯特·海明威(Ernest Hemingway 美国作家)

  代表作:《老人与海》《太阳照样升起》《永别了,武器》《丧钟为谁而鸣》

 1 function fibonacci(size) {
 2   var first = 0, second = 1, next, count = 2, result = [first, second];
 3   if(size < 2)
 4     return "the request was made but it was not good"
 5   while(count++ < size) {
 6     next = first + second;
 7     first = second;
 8     second = next;
 9     result.push(next);
10   }
11   return result;
12 }

  简洁明了的代码,没有任何多余的字母和变量,没有精心设计的逻辑和聪明的变量命名,非常平淡地表明了它是做什么的,仅此而已,这就是海明威的魅力之处。

  2.威廉·莎士比亚(William Shakespeare 英国诗人、戏剧家

  代表作: 《哈姆雷特》《奥赛罗》《李尔王》《罗密欧与朱丽叶》等

function theSeriesOfFIBONACCI(theSize) {//a CALCKULATION in two acts.//employ'ng the humourous logick of JAVA-SCRIPTE//Dramatis Personaevar theResult; //an ARRAY to contain THE NUMBERSvar theCounter; //a NUMBER, serv'nt to the FOR LOOP//ACT I: in which a ZERO is added for INITIATION//[ENTER: theResult]//Upon the noble list bestow a zerovar theResult = [0];//ACT II: a LOOP in which the final TWO NUMBERS are QUEREED and SUMM'D//[ENTER: theCounter]//Commence at one and venture o'er the numbersfor (theCounter = 1; theCounter < theSize; theCounter++) {//By divination set adjoining memberstheResult[theCounter] = (theResult[theCounter-1]||1) + theResult[Math.max(0, theCounter-2)];}//'Tis done, and here's the answer.return theResult;//[Exuent]
}

  大家可以看看莎士比亚是如何使用抑扬格五音步编写注释的。熟悉他戏剧的朋友应该对抑扬格五音步非常熟悉吧。

  3.安德烈·布勒东(Andre Breton 法国诗人)

  代表作:《超现实主义宣言》

function Colette(umbrella) {var staircase = 0, galleons = 0, brigantines = 1, armada = [galleons, brigantines], bassoon;Array.prototype.embrace = [].push;while(2 + staircase++ < umbrella) {bassoon = galleons + brigantines;armada.embrace(brigantines = (galleons = brigantines, bassoon));}return armada;
}

  整个解决方案的逻辑非常清晰、优雅,在galleons、brigantines、bassoons这三个之间,使用逗号操作符对它们进行同时转移。

  4.罗贝托·波拉尼奥(Roberto Bolano 智利小说家、诗人)

  代表作:《荒野侦探》《2666》

function LeonardoPisanoBigollo(l) {if(l < 0) {return "I'd prefer not to respond. (Although several replies occur to me)"}/**///Everything is getting complicated.for (var i=2,r=[0,1].slice(0,l);i<l;r.push(r[i-1]+r[i-2]),i++)/**///Here are some other mathematicians. Mostly it's just nonsense.rationalTheorists = ["Archimedes of Syracuse", "Pierre de Fermat (such margins, boys!)", "Srinivasa Ramanujan", "Rene Descartes", "Leonhard Euler", "Carl Gauss", "Johann Bernoulli", "Jacob Bernoulli", "Aryabhata", "Brahmagupta", "Bhaskara II", "Nilakantha Somayaji", "Omar Khayyám", "Muhammad ibn Mūsā al-Khwārizmī", "Bernhard Riemann", "Gottfried Leibniz", "Andrey Kolmogorov", "Euclid of Alexandria", "Jules Henri Poincaré", "Srinivasa Ramanujan", "Alexander Grothendieck (who could forget?)", "David Hilbert", "Alan Turing", "von Neumann", "Kurt Gödel", "Joseph-Louis Lagrange", "Georg Cantor", "William Rowan Hamilton", "Carl Jacobi", "Évariste Galois", "Nikolay Lobachevsky", "Rene Descartes", "Joseph Fourier", "Pierre-Simon Laplace", "Alonzo Church", "Nikolay Bogolyubov"]/**///I didn't understand any of this, but here it is anyway.return r/**///Nothing happens here and if it does I'd rather not talk about it.
}

  长短不齐的段落,缺少分号,使用隐式全局变量——对每一个变量都做进一步深入的说明。

  5. 查尔斯·狄更斯(Charles Dickens 英国小说家)

  代表作:《匹克威克外传》《雾都孤儿》《 双城记 》等

function mrFibbowicksNumbers(enormity) {var assortment = [0,1,1], tally = 3, artfulRatio = 1.61803;while(tally++ < enormity) {//here is an exceedingly clever deviceassortment.push(Math.round(assortment[tally-2] * artfulRatio));}//should there be an overabundance of elements, a remedy need be appliedreturn assortment.slice(0, enormity);
}

  从代码中可以看出,他没有体会到斐波那契数列的基本理念,而是采用乘法解决。代码里也有些有趣的命名,但缺乏核心地理解。

  二、实现factorial(n)阶乘

  以上是这些著名的作家用JavaScript编写斐波那契数列,下面再让我们看看,作家们是如何用JavaScript/CoffeeScript编写factorial(n)的。

  1. 杰克·凯鲁亚克(Jack Kerouac 美国小说家)

  代表作:《在路上》《贩毒者》等

/*...the only numbers for me are the mad ones, take forty-three like a
steam engine with a talky caboose at the end*/ n = 43, /*and that lanky
fellow in a cocked fedora*/ r = 1 /*then back to our number, our mad
number, mad to become one*/ while (n > 1) /*mad to descend*/ n--, /*mad
to multiply*/ r = r * n /*and at the end, you see the blue center-light
pop, and everybody goes 1.4050061177528801e+51...*/
r

  上面代码只能返回43的阶乘,如果想要实现另一个数的阶乘,你还需重写代码。不过,最值得注意地是,注释和代码几乎没有区别,无法分辨,从侧面反映了Kerouac的风格,很长、狂野和狂想式的流露。

  2.塞缪尔·约翰逊(Samuel Johnson 英国作家、诗人)

  代表作:《英语大辞典》《伦敦》《人类欲望的虚幻》等

# In which various NUMBERS are summon'd by
# means of ELECTRONICK CONJURY
factorial = (n) -># All argument is against it; yet all belief is for itreturn 1 unless n# Ingenious sophistry to prove the palp'bly OBVIOUSreturn 1 if n is 1# Recursion (n.)# a program that calls 'pon itself in the manner of# a dog returning unto its VOMITreturn n * factorial n - 1

  整段代码比较稀疏,中间也掺杂着Johnson的精言妙语:其中,他也对factorial(0)应该为1进行了怀疑,他应该用一个完整的句子来表达factorial(1)就是1,从其字典里进行推测,完成了一个具有讽刺定义的递归解除。

  Johnson的整个解决方案充满着艺术和模仿的结合——带有整洁表达式地温和的自我嘲讽和真正美丽的混合。

  3.詹姆斯·乔伊斯(James Joyce 爱尔兰作家、诗人)

  代表作:《尤利西斯》

  

function hacktorial(integette) {var nonthings = [undefined, null, false, 0, '', NaN];var resultution = 1;if (integette == 0) {//behold the strangerous zeroine!resultution = 1;} else {while (integette > 1)//caligulate by multicapablesresultution = resultution * integette--;}with(resultution) {var duodismal =  Function('return this').call(toString(12));var disemvowel = Function("n","return n?parseInt(n,12):'0'")return [disemvowel(duodismal.slice(0,-1)),'shillings and',disemvowel(duodismal[duodismal.length-1]), 'pence'].join(' ');}//klikkaklakkaklaskaklopatzklatschabattacreppycrottygraddahappluddyappladdypkonpkot!
}

  Joyce不仅仅是解决了阶乘问题,前半部分代码已经解决了这个问题,但Joyce坚决把结果转换为当时的货币:先令和便士。

  结果:

hacktorial(3) //"0 shillings and 6 pence"
hacktorial(4) //"2 shillings and 0 pence"
hacktorial(7) //"420 shillings and 0 pence"
hacktorial(21) //"4257578514309120000 shillings and 0 pence"

  4.理查德·费曼(Richard Feynman美国物理学家)

  代表作:《费曼物理学讲义》《物理之美》

//using Ramanujan's approximation
function fractorail(n){with(Math) {var r = sqrt(PI)*pow(n/E,n);r *= pow(8*pow(n, 3) + 4*(n*n) + n + 1/30, 1/6);return r;}
}

  费曼的工作的特点是具有大胆的创意和非常古怪的才华,从它所编写的这段代码中也能看出。

  结果,不要担心一些“舍入误差”,如果你非常熟悉JavaScript,你就应该知道:

fractorail(3); //6.00005
fractorail(1.1); //1.04671
fractorail(5.2); //169.40628

  5. 阿瑟·柯南·道尔(Arthur Conan Doyle世界著名小说家)

  代表作:《福尔摩斯探案集》《失落的世界》

"use strict";
//In solving a problem of this sort, the grand thing is to be able to reason backwards...
//some things are easier known than explained!
var caseHistory = new Object({2:2, 6:3});
function unfactorial(evidence){//first, humility!if (evidence === 1) {return "Watson, I am at a loss!"}//second, logical precedence!if(caseHistory[evidence]){//elementary!return caseHistory[evidence];}//third, eliminate the impossible!if(evidence === 0 || evidence % 24 !== 0) {return "charlatans!";}//fourth, deduction!var theDeduction, enumarator = evidence, denominator = 1;while(enumarator % denominator === 0) {enumarator = enumarator/denominator++;if (enumarator === denominator) {theDeduction = enumarator;}}theDeduction = theDeduction || "impostors";//What one man can invent another can discover!caseHistory[evidence] = theDeduction;//What remains, however improbable, must be the truth!return theDeduction;
}

  正如大家想象的那样, 柯南道尔的设计过程是精确和认真有序的,此外,大家可能注意到,他让其应用程序在strict模式运行——容不得半点马虎。

  6.简·奥斯汀(Jane Austen 英国小说家)

  代表作:《理智与情感》 《傲慢与偏见》

factorial = (function() {//I declare...var ledger = {};return function reckoning(quantity) {if (isNaN(quantity)) {console.log("I have not the pleasure of understanding you");return;}//It is a truth universally acknowledged that two values//can only be adjudged truly agreeable by means of ===if (quantity === 0) {return 1;}//Mr Crockford teaches that we be wary of inherited property...if (ledger.hasOwnProperty(quantity)) {return ledger[quantity];}//Pray persist until an answer is furnishedreturn ledger[quantity] = quantity * reckoning(quantity - 1);};
})();

  Jane Austen解决方案的亮点之一是代码工艺和结构的完整性,主要体现在代码块的整洁上,她调用模块模式,隐藏历史数据(或ledger)在上层结构的文件夹里;第二个则是体现了Jane Austen的俏皮,甚至是颠覆性的,对power的讽刺和荒谬的约定。

  7. 欧内斯特·海明威(Ernest Hemingway 美国小说家)

  代表作:《老人与海》《太阳照样升起》等

//Economy.
function factorial(n) {return n < 2 ? 1: factorial(n-1)*n;
}

  代码足以说明一切。

  我们从中所学到的

  这些著名的小说家、诗人、戏剧家的伟大之处在于他们勇于开拓新方式,尝试新的技术并且打破我们一直所遵循的规律。

最优秀的英语作家具有着对规则的蔑视。——Steven Pinker

  JavaScript作为最流行的编程语言之一,它的进步取决于开发者们地大胆创新、研究以及发现新模式,这样才能惠及更多的人。

  各位开发者们,如果让你们喜欢的作家来编写JavaScript代码会是啥样呢?不妨一起探讨下吧。

  英文来源:Angus Croll博客

  中文来源:WEB开发者(Admin10000.com)

转载于:https://www.cnblogs.com/erdeni/p/code-art.html

如果让莎士比亚、海明威编写JavaScript代码相关推荐

  1. 【Github上有趣的项目】基于RNN文本生成器,自动生成莎士比亚的剧本或者shell代码(不是python的是lua的)

    文章目录 下了之后才发现不是python的尴尬得一匹,,ԾㅂԾ,, GitHub 上有哪些有趣的关于 NLP 或者 DL 的项目? - Xiaoran的回答 - 知乎 char-rnn 下了之后才发现 ...

  2. tensorflow循环神经网络(RNN)文本生成莎士比亚剧集

    tensorflow循环神经网络(RNN)文本生成莎士比亚剧集 我们将使用 Andrej Karpathy 在<循环神经网络不合理的有效性>一文中提供的莎士比亚作品数据集.给定此数据中的一 ...

  3. 当莎士比亚遇见Google Flax:教你用​字符级语言模型和归递神经网络写“莎士比亚”式句子...

    作者 | Fabian Deuser 译者 | 天道酬勤 责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 有些人生来伟大,有些人成就伟大,而另一些人则拥有伟大. -- 威廉 ...

  4. [趣味文学]“帅气”的莎士比亚

    "对,你没有看错,眼前的这位就是年轻时的莎士比亚" 上面的这幅油画是威廉·莎士比亚去世前6年(即1610年)所作的肖像. 和大多数人先前想象的"秃头"" ...

  5. 莎士比亚数据集_如何使用深度学习写莎士比亚

    莎士比亚数据集 "开玩笑地说了许多真实的话." ―威廉·莎士比亚, 李尔王 "噢,主啊,当心嫉妒: 是嘲笑的绿眼怪物 它以肉为食." ― 奥赛罗的威廉·莎士比亚 ...

  6. 如何使用深度学习写莎士比亚

    "开玩笑地说了许多真实的话." ―威廉·莎士比亚, 李尔王 "噢,主啊,当心嫉妒: 是嘲笑的绿眼怪物 它以肉为食." ― 奥赛罗的威廉·莎士比亚 "有 ...

  7. 如何用RNN生成莎士比亚风格的句子?(文末赠书)

    作者 | 李理,环信人工智能研发中心vp,十多年自然语言处理和人工智能研发经验.主持研发过多款智能硬件的问答和对话系统,负责环信中文语义分析开放平台和环信智能机器人的设计与研发. 来源 | <深 ...

  8. 使用LSTM进行莎士比亚风格诗句生成

    本文章跟本人前面两篇文章(文章1, 文章2)的思路大体相同,都是使用序列化的数据集来训练RNN神经网络模型,然后自动生成相关的序列化.这篇文章使用莎士比亚诗词作为训练集,使用keras和tensorf ...

  9. GPT-3开始探索付费使用:每月700块,写得比莎士比亚还多

    2020-09-03 13:16:11 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 10月1日起,如果想要使用GPT-3接口的话,恐怕得收费了. 当然,如果你的使用程度在每个月100次 ...

最新文章

  1. python装饰器实例-python 装饰器(三):装饰器实例(一)
  2. UNIX网络编程——客户/服务器程序设计示范(一)
  3. linux解压后缀为.xz,xz后缀名文件解压方法
  4. linux7.0怎么设置中文,CentOS 7 yum安装zabbix 设置中文界面
  5. 大年30还多少天_大美鹅老李告诉你30天的鹅需要多少温度?
  6. JAVA接口继承、抽象类等
  7. HTML5 Canvas 绘制英国国旗
  8. python递归函数查询表_python利用递归函数输出嵌套列表的每个元素
  9. 研究云计算与大数据分析处理领域建议看的学术论文列表
  10. matlab超限像素平滑法_教程 | 不做手残党,玩转像素风LOGO的三大实用技巧!
  11. 软件设计原则(六) 合成复用原则
  12. java 支付宝转账_支付宝api实现转账到单个账号
  13. 马克思贡献了预备导数概念
  14. java lowpoly低多边形风格图片生成
  15. windows端的MarginNote:BookxNote
  16. angular的ngStrictDi
  17. win10monkey安装教程_详解win10下pytorch-gpu安装以及CUDA详细安装过程
  18. 正压控制单元KA5000F/风机节能仪KA5000F
  19. 服务器终端输出,服务器与终端数据交互程序
  20. 数据结构之ISAM文件和VSAM文件

热门文章

  1. C++学习之友元函数和友元类
  2. devexpress皮肤设置
  3. wps图表中如何插入甘特图_如何通过使用D3可视化数据集来构建类似甘特图的图表...
  4. 如何使用graphpad做柱形图_用Graphpad Prism轻松搞定不同类型的柱形图
  5. On Mobile Edge Caching 1
  6. Photoshop教程六:人相精修的几种方式
  7. 浙大计算机学硕调剂专硕,浙大学硕金融调剂到专硕金融的大概有多少呢?
  8. Photoshop - 无法完成请求,因为 JPEG 标志符段长度太短(该文件可能被截断或不完整)怎么办?
  9. Centos7.5解压rar包的方式
  10. vscode安装扩展插件-以python为例