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

如果让莎士比亚、海明威编写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博客

IBM Bluemix是什么? 【最具价值CTO评选秀】纷享销客CTO刘晨:企业移动的技术挑战 【最具价值CTO评选秀】能做存储的超级计算机——任宇翔和以色列团队的创业故事 OpenStack Swift存储策略 分享5个可视化的正则表达式编辑工具 在iOS程序中使用Bluemix云推送服务 GitHub开源任务列表组件 表白健身小能手!详解Apple Watch特色功能 高逼格不任性!个人智能航空摄影飞行设备ZANO Clappr——开源的Web视频播放器 东软举办2014解决方案论坛 将全面推进BBC战略 Google Glass已死,智能眼镜长存! 五个步骤,保护移动应用免受恶意攻击 声波改变移动社交——参加联想“茄子快传”创意征集 赢取平板电脑大奖! 车载硬件Baen:被游戏化的驾驶体验 深入解析Docker背后的namespace技术 响应苹果要求:Qt 5.4、Qt Creator 3.3同迎RC版 击碎泡沫谈发展,盘点OpenStack商业生态圈! 2014年11月操作系统份额:Windows 7雄居第一,XP跌新低 微信开放平台上线统计报表功能 【向导】如何开始学习高伸缩性编程? 基于Apache Samza,揭秘LinkedIn架构背后的技术 Aeron:每秒可以传递数百万消息的低延时开源消息系统 英特尔物联网马拉松:用创造力改变生活 年末总结:2014年全球手游市场发展的六大趋势 Saber——模块化、组合式的移动前端框架 什么仇什么怨?还原日本反美颜应用Primo真面目 横跨2D与3D!专属C#开发者的超强游戏引擎Paradox 首份“2014年移动外语学习行业报告”等你下载 《近匠》Ayla联合创始人张南雄:物联网发展的三个阶段 神器 VisuAlgo:通过动画学习算法和数据结构 Access数据库应该用什么数据库引擎驱动? 怎么做到你在Copy文件,遍历目录时.进度条和操作过程一至呢? 如何在XP下设置打印机的纸张 请问如何获取DataList的EditItemTemplate中的自定义控的属性? asp.net(C#)里,如何判断一个数据库的字段是否为null? 世界杯和队歌集锦 在汇编中,如何实现延时 Outlook的问题,很急!!!在线等!!! 小弟最近需要注册一国际域名,可否提供一个地方? 诚征MCSD考友,本人上地上班 请大家指教 请教各位一个关于ADO的问题,很奇怪 应用程序性能评测器 (APE,Application Performance Explorer)大家有没有使用经验?来交流以下了! 关于outlook express和MSN Messager的问题 我想从指定的文件初始化 Bitmap 类的新实例。我怎样才能更改那个新实例的大小和分辨率呢? 各位软件开发人员:大家都看到了IT市场的不景气,你们各自有什么看法,请发表意见!!! 送分了! 菜鸟提问: 用TDBNavigator + DBGrid删除记录时,会弹出一个英文的删除确认对话框,请问如何去掉该对话框? 急!!!win2000 server安装server pack 2重新启动进入系统后,一切都变成黑白的了???怎样解决?谢谢! 大家帮忙,哪里有datalist中绑定datalist或者datagrid的例子啊? 分啊 程序发布 dephi中用哪个函数可以解决两个日期的差,要求精确到分钟! 谁知道ipvod的透屏技术? 怎么从没有信任关系的网域的机器B上copy文件?有一个可以访问B的账号和密码. jsp中如何实现树状结构? applet 与servlet的通讯 请大虾们进来看看 请问大家如果使用了两个session会有什么影响吗?? 中国古典四大名著教给我们什么? 在iis中,如果需要让访问每个主页的用户都看到一个主页通知,该怎么做?就好象是做一条广告一样 怎么开始学习JAVA,没有c++的基础,很困惑 请教专家高手有什么好建议,谢谢 wingsun,bcb等大虾帮小弟看看这个"参数错误"的问题.谢谢 如何理解连接身份 如何用TURBO C编背景音乐? 我用exec() 来执行notepad.exe , 用它来打开我想要的文本 , 可是并没有得到notepad.exe执行。 你是想找一个爱你的人还是会找一个你爱的人? VC++中如何列出SQL_SERVER服务器?急救!!! 发展方向的问题??? 急救!!在线等待!!关于XmlHttp!! 关于wsad的使用上哪个论坛比较好,请大家推荐 关于Windows CE下面的密码验证 关于Visio2002版的安装问题 搞不定了:为啥我的EnumWindowsProc会引起outlook提示?附源码 给中国足球的一点建议,如果照着这条路走,20年后中国队还可以闯进世界杯 急急急!!关于打印问题!!!!!!!! 有谁在WIN2000P+ORACLE805安装了PROC? 寻找北京地区的兼职项目. 谁知道VB MSDN在哪里有下载,我给分! 关于Visual C++的编译器手册。 发挥主观能动性和尊重客观规律的关系? 海水提取NaCl制取碳酸钠要先向饱和食盐水通氨气的原因是什么?同上 英语翻译 尊重客观规律和发挥主观能动性的关系? 玻璃拔罐器哪个牌子好? KNO3溶液含有NACL,降温结晶,剩余溶液是? 与电感线圈串联或并联的灯泡在直流供电一段时间后断开开关,小灯泡亮度如何变化?刚接通电时又怎么样变化求规律如果是一灯泡与电感线圈串联后再与另一个灯泡并联呢?接通或断开会怎 大自然的启示发明的事例蝴蝶和卫星控温系统 遨游太空的人造卫星,当受到阳光强烈辐射时,卫星温度会高达200摄氏度;而在阴影区域,卫星温度会下降至零下200摄氏度左右,这很容易烤坏或冻 在二氧化硫和三氧化硫两种物质中,若分子数相同,则氧元素的质量比为…………1若分子数相等,则氧元素的质量比为:,物质质量比为:.2若硫元素质量相等,则分子个数比为:,氧元素的质量比 如何用光驱和电筒制作激光器 受大自然的启示有发明的事例 当二氧化硫和三氧化硫中含有相同质量的氧元素时,它们的分子数之比为.当二氧化硫和三氧化硫中含有相同质量的氧元素时,它们的分子数之比为( )A.1∶1 B.2∶3 C.3∶2 D.3∶4 吸铁石如何隔物吸铁 大自然的启示或从植物集上得到启发的发明创造的事例 冬天,为什么要用熔点高的汽油?熔点高,车不是更难启动? 谁能帮我出份八年级语文下册的期中试卷?满分150分,带上答案的.THANKS!人教版的! 现在有什么东东是科学家从大自然的启示中发明创造的? 具有相同分子数的二氧化硫和三氧化硫,它们所含氧元素的质量比为:----------(解题思路) 月球尘土是否有杀菌的本领 红外线与紫外线都属于 光 红外线和紫外线都是什么光线?为什么这种光线用肉眼看不到?红外线是红色的吗?紫外线是紫色的吗?为何叫红外线和紫外线? 月球上的尘土是否有杀菌本领 红外线和紫外线被称为什么光? 请问这两个auto是什么意思?duplex auto跟speed auto 一轮26型自行车车轮的外直径是64cm是28型及行车车轮的外直径的17分之16.26型车轮的面积是28型车轮面积的多少倍 什么无水盐可以做干燥剂? clean什么意思不知道中文意思 28号自行车前齿轮有几个?后齿轮有几个?车轮直径多少? 汽油单相发电机不用启动能充磁吗 android clean是什么意思,如何clean 磁铁除了可以吸铁还可以吸什么物质啊? 两台单相发电机(220v)并机运行要有什么条件?不同型号的汽油发动机能并机吗?因为单位的发电机功率太小,5.5kw.7.5kw.我们的用电功率最小要12kw以上. clean的意思clean中文意思 磁铁为什么只可吸引铁的东西?并且为什么磁铁只可对铁吸引, 下列说法错误的是:1富氧空气可用于潜水,医疗急救.2氧气能支持燃烧,可做燃料.3氮气充入食品包装袋内可以防腐.4稀有气体充入灯泡内可以使其耐用. 阳光有紫外线吗﹖一个有红外线吗﹖ 磁铁为什么不能吸不是铁做的物品? 潜水,医疗急救及炼钢等,都需要纯氧或富氧空气.这是对的么? 阳光中的紫外线对人体有好处吗?红外线又是什么? 单缸柴油机活塞环怎么装 臭氧在空气中有何作用? 如何制作能给手机充电的发电机 为什么月球上满是尘土 岩石和环形山? 有人可以把单缸的柴油机装到两厢的汽车上吗? (1)将“生石灰”干燥剂打开,放入瓶子里,向瓶子里加满水,摇晃 观察到什么(2)放置一天后 观察到什么 用满是,没有,没有造句.如:月球上满是尘土、岩石和环形山,没有水,没有任何生命. 单缸柴油机活塞与连杆怎么安装 怎么分辨反正 如何安装正确 我把海苔里的食品干燥剂生石灰加了大约六分之一矿泉水瓶水,然后倒在了一个矿泉水瓶子里把盖子拧紧了 过了一会它放热了 有过了一会后 瓶子开始涨大 我一害怕就从六楼把它扔下去了 它 月球上满是尘土、岩石和环形山,没有水没有任何生命.(这句话对吗) booth乘法器原理? u型管内是干燥剂,两个瓶子里是澄清石灰水,求详解 如何区分红外线紫外线 谁有关于发明创造的例子?(从大自然身上得到的启发)越详细越好,越多越好! 汽油车在零下多少度时启动难如果防冻液,机油都用目前世界上最好的,那极限低温是多少度? 区分红外线与紫外线现有两个光源,一个能产生红外线,一个能产生紫外线,光源上无任何标志,你有什么办法可以区分它们中那一个是红色光源,哪一个是紫色光源吗? 受自然启发发明创造的事例 我国工业呈___、 ____ 、 ___分布特点 稀硝酸逐滴加入到铝粉与铁粉混合物中的方程式是?稀硝酸逐滴加入到铝粉与铁粉混合物中的方程式,还有滴入铜粉与铝粉的 写谈谈自己了解到的发明创造的事例和自己从动植物身上得到启示想发明什么?400字以上是作文哦! 中国工业的分布特点、分析原因、
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘