最近,我做了一个梦,我请海明威和其他四位文学名人替我编写JavaScript代码,一个函数返回一个给定长度的斐波纳契数列。有趣地是,他们每个人都以不同的方式完成了这一题,并且都做的很好——只是我想说,每个解决方案工作起来都好比广告(即使是Andre Breton的),后来我又请包括海明威在内的7名文豪用JavaScript来编写阶乘,似乎一切都那么神奇,但他们都成功地完成了,大家不妨来看看结果吧。
一、实现斐波纳契数列
1.欧内斯特·海明威(Ernest Hemingway 美国作家)
代表作:《老人与海》《太阳照样升起》《永别了,武器》《丧钟为谁而鸣》
1
2
3
4
5
6
7
8
9
10
11
12
|
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 英国诗人、戏剧家)
代表作: 《哈姆雷特》《奥赛罗》《李尔王》《罗密欧与朱丽叶》等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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 法国诗人)
代表作:《超现实主义宣言》
1
2
3
4
5
6
7
8
9
|
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》
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 英国小说家)
代表作:《匹克威克外传》《雾都孤儿》《 双城记 》等
1
2
3
4
5
6
7
8
9
10
|
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)阶乘
1. 杰克·凯鲁亚克(Jack Kerouac 美国小说家)
代表作:《在路上》《贩毒者》等
1
2
3
4
5
6
7
|
/*...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 英国作家、诗人)
代表作:《英语大辞典》《伦敦》《人类欲望的虚幻》等
1
2
3
4
5
6
7
8
9
10
11
|
# In which various NUMBERS are summon'd by
# means of ELECTRONICK CONJURY
factorial = (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.詹姆斯·乔伊斯(James Joyce 爱尔兰作家、诗人)
代表作:《尤利西斯》
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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坚决把结果转换为当时的货币:先令和便士。
结果:
1
2
3
4
|
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美国物理学家)
代表作:《费曼物理学讲义》《物理之美》
1
2
3
4
5
6
7
8
|
//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,你就应该知道:
1
2
3
|
fractorail(3);
//6.00005
fractorail(1.1);
//1.04671
fractorail(5.2);
//169.40628
|
5. 阿瑟·柯南·道尔(Arthur Conan Doyle世界著名小说家)
代表作:《福尔摩斯探案集》《失落的世界》
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
"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 英国小说家)
代表作:《理智与情感》 《傲慢与偏见》
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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. 欧内斯特·海明威(Ernest Hemingway 美国小说家)
代表作:《老人与海》《太阳照样升起》等
1
2
3
4
|
//Economy.
function
factorial(n) {
return
n < 2 ? 1: factorial(n-1)*n;
}
|
我们从中所学到的
这些著名的小说家、诗人、戏剧家的伟大之处在于他们勇于开拓新方式,尝试新的技术并且打破我们一直所遵循的规律。
最优秀的英语作家具有着对规则的蔑视。——Steven Pinker
JavaScript作为最流行的编程语言之一,它的进步取决于开发者们地大胆创新、研究以及发现新模式,这样才能惠及更多的人。
各位开发者们,如果让你们喜欢的作家来编写JavaScript代码会是啥样呢?不妨一起探讨下吧。