说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
每位开发者都有自己习惯的编码风格,而文学作家也有自己标志性的写作方式。试想一下,如果让莎士比亚、海明威这样的大文豪来写JavaScript代码,会呈现出什么样的风格呢?

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

下面是对原文的摘译。

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

一、实现斐波纳契数列

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

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

function fibonacci(size) {  var first = 0, second = 1, next, count = 2, result = [first, second];  if(size < 2)    return "the request was made but it was not good"  while(count++ < size) {    next = first + second;    first = second;    second = next;    result.push(next);  }  return result;}

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

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

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

function theSeriesOfFIBONACCI(theSize) {  //a CALCKULATION in two acts.  //employ'ng the humourous logick of JAVA-SCRIPTE  //Dramatis Personae  var theResult; //an ARRAY to contain THE NUMBERS  var 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 zero  var 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 numbers  for (theCounter = 1; theCounter < theSize; theCounter++) {    //By divination set adjoining members    theResult[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. 查尔斯·狄更斯(CharlesDickens 英国小说家)

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

function mrFibbowicksNumbers(enormity) {  var assortment = [0,1,1], tally = 3, artfulRatio = 1.61803;  while(tally++ < enormity) {    //here is an exceedingly clever device    assortment.push(Math.round(assortment[tally-2] * artfulRatio));  }  //should there be an overabundance of elements, a remedy need be applied  return 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 asteam engine with a talky caboose at the end*/ n = 43, /*and that lankyfellow in a cocked fedora*/ r = 1 /*then back to our number, our madnumber, mad to become one*/ while (n > 1) /*mad to descend*/ n--, /*madto multiply*/ r = r * n /*and at the end, you see the blue center-lightpop, and everybody goes 1.4050061177528801e+51...*/r

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

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

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

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

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

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

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

代表作:《尤利西斯》

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 multicapables    resultution = 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 approximationfunction 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.00005fractorail(1.1); //1.04671fractorail(5.2); //169.40628

5. 阿瑟·柯南·道尔(ArthurConan 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 furnished    return ledger[quantity] = quantity * reckoning(quantity - 1);  };})();

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

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

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

//Economy.function factorial(n) {  return n < 2 ? 1: factorial(n-1)*n;}
代码足以说明一切。

我们从中所学到的

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

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

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

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

来自: Angus Croll博客

深入SERIPTING RUNTIME LIBRARY-VB资料 &#39;识别常数的简单四则运算-VB资料 实现平面工具栏 -VB资料 使程序不在 Ctrl+Alt+Del 弹出的对话框内-VB资料 VB使用 API 开始屏幕保护 VB使用rdoPreparedStatement实现参数化查询 使用Vb5制作Easter Egg 使用VB实现所见即所得功能 使用VB中的SERIPTING RUNTIME LIBRARY VB使用Win95的动画光标 VB使用Windows内建的图标 VB使用Word的“艺术字”工具 VB使用WriteFile 块读/写数据 VB使用枚举变量 VB使用数组做属性 VB使用未安装的字体 输入限制确认-VB资料 熟悉VB的集成开发环境 鼠标取词-VB资料 谈变VB中APP.PAHT的注意事项 探讨高效的排序合并算法-VB资料 剔除INI文件中的注释部分-VB资料 提取可执行文件中的图标-VB资料 添加记录到文档菜单-VB资料 突破 SendKeys 的限制-VB资料 突破SendKeys的限制 -VB资料 圖面背景透明的技巧-VB资料 退出并关闭 Windows-VB资料 托盘程序详解(二) -VB资料 托盘程序详解(一) -VB资料 我怎样确定我的程序是否在运行?-VB资料 如何建立一个对象数组 winexec启动/关闭外部程序的问题 多组数据保存到文件和提取的问题!!(第3遍发问了,帮忙看看啊!)谢谢谢谢!!!!! CRecordSet可以执行SQL语句吗 >>>>>超难度问题<<<<<怎样在屏幕上锁定一个移动的物体并得到它的x,y坐标 用ADO访问数据库时,如何拼写动态SQL 麻烦给发个Jbuilder7的注册机,注册码不会用不要!急! 请问在ASP中调用DLL到底需不需要注册,我怎么看有的需要注册,有的不需要! ASP 0115 ??错误,怎么办?急 OLE 文档序列化!请大虾指教! 双硬盘????,郁闷中。。。在线等 批量数据写入,是否有简捷的方法 请问谁有1、美达S693A2主板光盘;2、还有美达p4vad主板,是什么显卡? 用java weblogic.ejbc编译时为何总报找不到.xml文件 ftp的问题 请问各位:如何在ASP.NET中打开一个现有的或一个新的WORD文档? 讨论怎么发财 关于查询系统的需求分析怎么写?用触摸屏实现 如何把一个文件保存到数据库中? 耦合 哪里有WEB合同管理代码?或资料?演示?急!!!谢谢!有人知道吗?? 谁能把这段代码破解 求一函数,在线等....... 剛&#24478;vb轉delphi,&#24171;我看一看!結貼&#24456;&#24555;! 如何可在WINXP中改MAC?? sprintf(a,"%2X",b)问题 关于简单的access查询 java字符转换问题!!! 请教一个Struts标记问题! 一个cab下载的错误信息解读,请教高人。 OutLook?怎么用它发邮件,经常提示错误? 帮看这段删除纪录代码有什么问题?三层结构oracle 本人要做一个WEB合同管理平台,由于以前没做过,请大家指示? Web Application 中怎么来调用 Web Server?谢谢! DataGrid中模板列嵌套的DataGrid怎样相应其事件 [调查]程序员证在你们公司里到底有多大的作用?有多少人有证?希望有没有证的都进来说一下。 怎样把字符串"C;\aaa\bbb"变成字符串"C:\aaa\ccc\dd"?用什么函数,操作? 我的SQL Server 装好后,出现下面的错误 这个文件查找真是怪!......msdn源代码居然有问题, 进来看看... 请问在TreeView控件中如何通过光标的上下移动获得光标所在项在数据库中的ID值 對掌上電腦Sony Peg-TG50和ACER N10怎麼看??? 使用SOAP协议传递服务器端查询结果容量问题? 菜鸟问题:数据窗口怎么设置检索参数?急!!在线等 ****入门提出的问题****,请各位高手指教! 很简单的一个问题。 这个问题怎么处理? vb如何调用一个组件?? 一个小问题,可不简单哦! 应聘CMM时,会被问到什么有关CMM的问题? 调用servlet出现这个错误HTTP method POST is not supported by this URL 在公网上如何连接远程数据库啊。。 跟踪练习五,回答既给好评 给下列广告消毒 恢复这些成语的原貌1、某消炎广告词:快治人口【 】2、某止咳广告词:咳不容缓【 】3、某自行车广告词:骑乐无穷【 】4、某保温杯广告词:有口皆杯【 】 对于参数已定的微分或耦合电路,当矩形脉冲频率改变时,输出信号波形是否也改变?为什么? 练习五.8.用棱长1cm的小正方体摆成稍大一些的正方体,至少需要多少个小正方体? 活的大闸蟹如何保鲜 鲁滨逊做成这只大型独木舟真是费尽了心血,他总花了( )个月的时间! 怎样快速写离子方程式?看到一个反应不用化学方程式就可以写离子方程式的 如何把长气球弄成动物造型 鲁滨逊为了做好这只大型独木舟,共花了几个月的时间 求练习五的答案! 大闸蟹怎么保鲜 鲁滨逊做木栅栏花了多长时间? 练习五的成语练习五的所有成语意思 大闸蟹怎样保鲜 亲本基因型的判断一雄蜂和一雌蜂交配后产生F1雄蜂的基因型为Ab,aB,AB,ab四种,雌蜂的基因型为AaBb,Aabb,aaBb,aabb则亲本基因型是什么? heip me 全对给100将下列物质分别按混合物,纯净物;单质,化合物,氧化物分类1空气 2氧气 3水蒸气 4二氧化碳 5高锰酸钾 6铁粉 7氮气 8氧化铁 关于大闸蟹保鲜问题我想邮寄给朋友大闸蟹,朋友在上海,我在常熟,如何才能使大闸蟹不死亡 事件发生的可能性不管有多小,但是都一定会发生.这是什么定理 离子方程式的书写是否需要写上发生条件比如一个离子反应的发生需要催化剂 需要在离子反应方程式上写出来吗?举个例子吧 要写催化剂的 求歌词:歌词oh wa ou sister oh oh oh 歌名 新闻的客观主义理论? 人生若只如初见,何事西风悲画扇?等闲变却故人心,却道故人心易变!这个世界还有沧海桑田吗?这个世界还有沧海桑田吗? 罗西尼的机械表怎么样罗西尼的这款表怎么样7419W03C 我们这2300元 机芯好么 是这个好 还是西铁城的光动能好呢 想买个两千多的 化学方程式的书写和计算 如果人的命已经注定,当知道这个事实生活的意义又是什么?有些人不相信,我也不想相信,但问题是这些东西是能算出来的,而且很准啊,这怎么解释呢,性格,生活水平,工作都可以算出来,那不就说 中共八七会议的主要内容 请问罗西尼的机械表怎么样啊?走时准确吗? 当你说需要个夏天我会拼了命的努力 当你说需要个夏天我会拼了命的努力,我说的是这句话,他想要夏天,另外一个为什么要努力呢? 八七会议的主要内容? 一年之计在于春这句话的含义 化学计量中什么时候用mol什么时候用NA 即墨实验高中高一语文课本里都有什么需要背的课文? 八七会议确定的党的总方针是?急要.有人知道么 请问B型血的人,有什么不适合吃的食物吗? 功w=fs,s是时间还是距离?w有用=fs,s是时间还是距离?晕了 请问“纯电能”有用吗 B型血的人不能吃什么东西? 关于W=FS的问题.请问一下F等于啥? 纯电能汽车还不能大量应用的主要技术或资源困难是什么. B型血的人应该吃什么求解答 在水平匀速拉动物体,η=W有用÷W总=fs物÷Fs绳×100%,这里的摩擦力f和拉力F相同吗?为什么? 黄金杠杆比例是什么意思.如果亏了是怎么算的. 为什么说牛蒡茶养人 如何提高油分离器的效率 醉汉骑驴,颠头簸脑算酒帐.艄公摇橹,打躬()()讨船钱----- 女人喝牛蒡茶好吗 构成胃蛋白酶分子的基本单位是? 天通金是什么 什么人不能喝牛蒡茶 八七会议总方针内容 天通金怎么样 女性喝牛蒡茶好吗?牛蒡茶的功效与作用有哪些? 优点和缺点分别是什么? 手机淘宝秒杀出现3个方框和几行文字如图要填什么才对,应该怎么填 牛蒡茶,牛蒡茶哪里的牛蒡茶好,洪北苑牛蒡茶怎么样? 什么时候进行的?有什么优点,有什么弊端? 淘宝上秒杀东西时跳出来的3个方格要填什么 单质的定义 某同学在做电解食盐水的实验时,误用铜棒作两极材料,请判断下列说法正确的是( ).A.完全电解后,得到CuCl2溶液B.电解完全并放置一段时间后,得到蓝色沉淀和NaCl溶液C.电解一段时间后NaCl浓度可 单基因遗传病患者体内都有一对异常基因这句话对不对 《纽约时报》著名专栏作家托马斯:上海被控杀死杰克逊者出狱 称为谋生计想当圣马力诺执政官会见王毅王毅同圣马力诺外长瓦伦蒂尼会谈美国对监听国家分“三六九等”纽约手机可接收紧急警报韩国向美国求证韩总统是否遭窃听 但美猫鼬欲擒毒蛇当美食遭反击败阵(组图)中国赴刚果(金)维和工兵分队顺利通过羊晚集团派工作组对新快报存在问题进行美国在罗马尼亚的反导基地开建纽约手机可接收紧急警报强风暴过境德国致多地交通瘫痪美国与新西兰恢复联合军演国务院批复绍兴撤销绍兴县设柯桥区 撤Google加产数万副谷歌眼镜 20世行报告称全球营商环境改善翘臀又嘟嘴 壮汉翻拍“性感照”遭吐槽日本进入“胖女时代”或因对瘦人审美疲12岁黑客入侵加拿大政府网站 辩称仅11年来最强风暴袭英国 海陆空交通大教育短波“开学综合征”游荡,“缠”上你了吗?韩美展开大规模联合军演让人才受重视、受尊重、得实惠巩汉林小时候曾遭遇校园暴力,期待立法别人生二孩,我能收养“二孩”吗?政府工作报告新词回应公众关切郑州航空港经济综合实验区大事记中国男女乒均第 20次获团体冠军电表校核合格高耗电原因尚不知村医老马的履职时间病人无法入院,医保“总额预付”惹祸?丙肝患者治疗获突破正能量日记感动人心援疆支教,20名教师接过接力棒本周气温“大跳水”,部分地区有雨雪周繁漪:超越时空的抗争伤心事窝心事,请您来倾诉!上周,被拐 25年的儿子找到了中国男女乒均第 20次获团体冠军郑州理化生实操考试时间敲定
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘