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

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

在ListBox适当设定水平滚动条的宽度-VB资料 在VB中利用API实现窗体的平滑显示 在vb中让控件大小和位置随着表单的大小成比例变化的方法 在VB中实现闪动标题栏 在VB中实现位图的透明放置 在VB中使用数据窗体设计器插件 在VB中制作单独程序封面的两种方法 在VB中制作透明按钮 在Visual Basic中如何拖动窗体或控件 在Visual Basic中显示动态运行进度 在菜单中加入图标 -VB资料 在程序中调用关闭Windows对话框-VB资料 在任务栏中显示无边框窗体的图标-VB资料 在系统菜单上添加自定义菜单项 -VB资料 在运行时动态生成多个相同的控件?-VB资料 在最小化状态时提供提示 -VB资料 暂时禁止窗口更新-VB资料 VB怎样得到文本框(TextBox)中的文本行数? 制造出透明的Form -VB资料 VB制作半透明窗体和形状不规则的窗体 VB制作方向按钮 VB制作渐变的窗口背景色 字体闪烁 -VB资料 自动改变控件大小-VB资料 自制IE风格按纽控件-VB资料 VB6.0中通过MSChart控件调用数据库 用VB6实现动态增减控件 ActiveX控件的创建-VB资料 ADO控件和DATA控件的冲突(不能共存)的解决方法-VB资料 Combo的自动查询技术 -VB资料 DirectX7.0使用心得(1) -VB资料 为什么我每次用UpdateUI刷新JTree时都有错? 本菜鸟想问一个怎么定义公用函数的问题!请各位大虾不吝赐教!不胜感激。 我这个人啊!!大家可能还不了解!! 网友六一见面,找个网友男朋友看海,找个网友男朋友看星星! 请教!! 求教SQL语句 神洲数码怎样? 请大家帮帮忙:如何将一个字符转换为unicode码形式(得到的是数字,而不是字符串)! msn怎么通不过http代理 求助:J2EE Container中deployed的servlet是否可以调用EJB local home? 有关时间限制 ie问题有没有碰到过 TADOTable+TDBGridEH+TDataSource中编辑一有关键字的表时,怎样做到避免在输入相同的关键字时的出错? IE经常自动关闭是什么原因 菜鸟请教 UlraEdit? 四舍五入的函数是什么?? 帮帮忙!!!我编译出这问题?? 请问:发现病毒:生成folder.htt,还有后缀都是htt的其他文件,用kv3000杀,提示kbs\kj,请问是什么病毒,怎么杀毒(急)? ie问题有没有碰到过 打开adsl的猫机器能自己启动为什么? 神洲数码怎样? linux中如何得到某个网络设备的ip地址? 请教ADO的Recordset对象的Delete的问题 请问jbuilder的参考书,哪本比较好?市面好像种类比较少 请问怎样获得临时表的记录? @@@@@@@@@@如何使我的折线图随着时间移动@@@@@@@@@@ 菜鸟问:各位大哥看c++ primer的时候是用什么编译器? 神洲数码怎样? jsp如何将web页面的String型转换为long型? 极容易的问题 ,先来先得! 大虾,救命啊!!!!!! jsp如何将web页面的String型转换为long型? ★★★帮忙翻译一句话!谢谢★★★ **冗余醒目**《如何在输入的时候减小冗余》**冗余醒目** 倡议书:维护您的网络权益 [100分,两日内结]怎样在jsp中得到我的数据 两个菜鸟问题,送分拉 线程与消息??? c、odbc、嵌入式sql的关系? 简单的重载问题! 用<input type="fiel" name="test">时,怎样判断输进去的文件是硬盘上实际存在的? 请问哪里有eclipse 下载? FINDING SOMEBODY! 显示器不亮,请帮忙,解决给100分 写在3.15黎明的前夕 **冗余醒目**《如何在输入的时候减小冗余》**冗余醒目** 各位,CSDN的论坛都是用些什么工具开发的?? 请问个位大虾,我的程序为什么不能执行(TC++3.0) 在VC中怎么调用IE来显示一个页面? 怎样在新开的页面给已开的页面上的一个TextBox插入新的字符串 小磁针南极在磁场中所受磁力的方向和磁场方向( 磁力方向和磁场方向是什么?如果把南极换成北极,又是怎么回事? 我叫mt置换在哪里 不敢回忆的那一次!限八点钟之前!雪,纷纷的雪,洗浴整个世界的雪,最终不能洗净人的心灵.  我低头专心应付着地上的冰,不敢旁顾斜视,生怕一个不小心,来个四脚朝天.  突然,在前方,在我 请教化工厂区空气中苯、甲苯、二甲苯含量的标准. 真空能传声吗 不敢回忆那一次 阅读题答案中:当女残疾人扶我时,我为什么会觉得有十几只狼在咬我?下意识地我告诫自己千万千万不要摔倒,身体本能地站得更稳——一般人都会从别人的摔倒中得到教训. 查找的反义词? 我叫MT3.2版本中的置换是什么意思? 潮吹_如何潮吹_什么是潮吹_怎样潮吹_女性潮吹 大概说说就行了对联的特点和含义 真空中能不能传声? 什么是潮吹?真的有潮吹吗? 帮我分析下这副对联的特点好吗?是屈原的"泪滴湘江流满海,嗟叹嚎啕哽咽喉" 我叫MT置换问题为什么置换功能介绍中说明了可以置换紫卡而我的只能置换白卡与绿卡?大神求解 电子跳蚤落在数轴上的某点,第一步从K0向左跳1个单位到K1,第二步从K1向右跳2个单位到K2,第3从K2向左跳3个单位到K3,第四步由K3向右跳四个单位到K4..,按以上规律跳了100步时,电子跳蚤落在数轴的 谁知道这副对联的含义?快过年了,家家户户都忙着贴对联,一个穷得快揭不开锅的老秀才为自己写了:横批:南北 上联:二三四五 下联:六七八九 任何一条纬线都能地球分为两个半球吗?急用.明天中考, 女人潮,吹是怎么回事?为什么会潮,吹… 微波炉消毒原理,是高温灭活?还是破坏生物细胞? 电离层是由什么组成的? 潮吹是什么? 微波炉的消毒原理,是高温灭活?还是破坏生物细胞? 热力站的循环泵和板式换热器怎么计算选取求详细计算公式 在下列4个图中,只能是由常染色体上隐性基因决定的遗传病是 对空气质量有影响的悬浮物,如何来治理 换热站的板式换热器的换热面积怎么求?还有二次循环泵~供暖16万平米小区 北京地区 一次供回120-70° 二次供回85-60° 求算下二次循环泵要多大的流量 公式什么的详细点,抄袭的别来.我知道板 已知,在三角形abc中,ab=ac,d是三角形abc中的一点,且角adb=角adc,求证bd=dcrt 对于空气中的悬浮物,应采取那些措施.^^^^^^^^^^^^^^ 市场调查与预测1、市场预测常用的方法有哪些? 2、市场调查按研究性质分类可以分成几类? 3、怎样分析产品的渗透深度? 4、如何做产品的试销分析? 己知在三角形ABC中,AB=AC,D是三角形ABC中的一点,且角ADB=角ADC,求证:BD=DC图暂时没有 空气悬浮层问题?在东北灰尘一般悬浮在多高的楼层? 为什么压力表使用范围最高不得超过度盘满刻度的 3/4? 说一说,在你的生活中,科学带给你的影响和改变. 如何使用活性炭治理空气悬浮物?为什么可以这样?还有为什么向空中喷水雾可以也可以治理? 这是什么鱼,怎样做好吃 是谁改变了你的生活.如果有人改变了你的生活,为你带来了一片新天地,你会感激他一辈子吗? 空气悬浮物高度30米左右有没有科学依据 冰鱼,冰鱼出品,冰鱼工作室是怎么回事? 我叫MT 安装失败 如题 我下 靠谱安装的 提示 安装失败 考察的意思是什么 教育办公场所室内绿化植物有哪些?之前看了一些感觉不是很好.最好附上每种植物的含义、作用! 除了金属甚么东西会导电?物质具有甚么性质能导电 反应中为什么要强调加热,使液体迅速升到170℃? 山谷中的谜底 找反义词当雪积到一定程度时,雪松那富有弹性的枝丫就开始向下弯曲,于是积雪便从树枝上滑落,待压力减轻,刚弯下去的树枝又立即反弹过来,雪松依旧保持着苍翠挺拔的身姿.就 日常生活中哪些东西可以导电?制作科学小发明怎样安全使用电线或线路或导体? 冬天的气温高好还是低好?近几年的冬天的气温已经逐渐的升高,已经开始了暖冬的现象.可是对于生活在寒冷地区的人们来说,冬天的气温升高是件好事,因为人们并不希望生活的环境总是在零 找反义词 日常生活用品哪里有导电橡胶 测辣椒精含量时加氢氧化钠后为什么溶液会变浑浊啊? 需氧呼吸中氧气的作用RT 山中访友原文中找近反义词 必须文中的比如课文里有两个词在文中是近义词就是 声音材料是否可以作为证据具体的事情我就不说了,很长很长的.就想来问下大家:录下的音(对话)可不可以作为申请立案的证据?如果录音中的一方死亡了(因为对方是已经不行的老人),那 我叫mt怎么置换卡牌 用了麦迪格除蛋白的保存液,还用每周再除蛋白吗? 磁力方向和磁场方向的关系 声音在真空中能不能传声? 蛋白质的保存方法都有哪些? 通电电导体在磁场中受力的方向因为“既垂直于电流方向,又垂直于磁场方向”有两个方向,而实际上受力方向只有一个.(电流方向与磁场方向不垂直).如果产生两个力,是算他们的合力吗? 青蛙为什么不能飞0 0NO 下列四个遗传系图谱中,只能由常染色体上隐性基因决定的遗传病的是? 中国和塞浦路斯签协定保护文化财产宠物犬被指与主人长得像 日学者称关键JAEA报告称福岛核电站附近森林核辐法国拟试行按剂量出售抗生素以减少药物沙特女性抗议者拟无视政府禁驾令“顶风美称监听欧洲公民的是欧情报机构 美只美科学家称“亚洲鲤鱼”大量繁殖威胁当中国军舰经与那国岛毗邻区返航 日防相意大利比萨斜塔修复见成效 12年扶正欧洲风暴肆虐 高校推风暴命名项目收费日土发表共同宣言 安倍决心加强战略伙美华裔众议员称美主持人为攻击性言论道湖南一希望小学被强拆 当地称“项目重教师为讨960元代课费跑15年 江西韩国特种部队女兵彩排不忘自拍留念(组日本女高中生为何讨厌自己的爸爸?美国有意叫停窃听盟国元首 部门“内讧奥巴马提名两名竞选支持者为美国驻外大叙利亚总统巴沙尔再颁大赦令金华男子貌若金城武 3个姑娘心甘情愿第13届中国网络媒体论坛在郑州举行 26岁美女要嫁79岁杀人犯!出门须跨粪水,在家得忍恶臭玩具太闹 当心孩子听力被玩坏专家:金砖合作与区域合作有机联动促进超市促销要标明“降价”原因看巴西正宗足球、喝加多宝正宗凉茶《第四度封王》攻势足球的回归唔饮山泉水中国假大学又冒出60家 校名很熟很容第二期公车拍卖暂定本月底开拍流动摊贩“合法”之后……深晚悦读女郎初次亮相合唱“奥运会” “小海燕”两招识别李鬼大学 先点后缀.edu.金汇观潮官员独董退而不休曲线上位女子被老公追杀至银行内砍死严禁教师收受学生礼品礼金去年城镇非私营单位月均工资4468元昆明市委书记张田欣被免职世界杯决赛夜 交警查17宗酒驾
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘