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

2023-11-03 10:21

本文主要是介绍【杂谈】如果让莎士比亚、海明威编写JavaScript代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么80%的码农都做不了架构师?>>>   hot3.png

最近,我做了一个梦,我请海明威和其他四位文学名人替我编写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.威廉&middot;莎士比亚(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.安德烈&middot;布勒东(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.罗贝托&middot;波拉尼奥(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&aacute;m", "Muhammad ibn Mūsā al-Khwārizmī", "Bernhard Riemann", "Gottfried Leibniz", "Andrey Kolmogorov", "Euclid of Alexandria", "Jules Henri Poincar&eacute;", "Srinivasa Ramanujan", "Alexander Grothendieck (who could forget?)", "David Hilbert", "Alan Turing", "von Neumann", "Kurt G&ouml;del", "Joseph-Louis Lagrange", "Georg Cantor", "William Rowan Hamilton", "Carl Jacobi", "&Eacute;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. 查尔斯&middot;狄更斯(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. 杰克&middot;凯鲁亚克(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.塞缪尔&middot;约翰逊(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.詹姆斯&middot;乔伊斯(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.理查德&middot;费曼(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. 阿瑟&middot;柯南&middot;道尔(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.简&middot;奥斯汀(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. 欧内斯特&middot;海明威(Ernest Hemingway 美国小说家)

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

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

代码足以说明一切。

我们从中所学到的

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

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

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

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

转载于:https://my.oschina.net/maomi/blog/150134

这篇关于【杂谈】如果让莎士比亚、海明威编写JavaScript代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/337517

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1