让我们比比长短
最近liangent向我推荐了一个编程解题的网站:ProjectEuler.大家都知道,Euler就是欧拉,有史以来最伟大的数学家之一。这个网站的题目都是和数字有关的。我刚刚开始做,发现上面有一群职业的程序员,非常有意思。
不难,我用pascal写的源码如下:
program euler16;
var a:array[0..1000] of integer;
n,i,j,len:integer;
begin
a[1]:=1;
len:=1;
for i:=1 to 1000 do begin
a[1]:=a[1]*2;
for j:=2 to len do begin
a[j]:=a[j]*2;
a[j]:=a[j]+a[j-1] div 10;
a[j-1]:=a[j-1] mod 10;
end;
if a[len]>=10 then begin
len:=len+1;
a[len]:=a[len-1] div 10;
a[len-1]:=a[len-1] mod 10;
end;
end;
n:=0;
for i:=1 to len do
n:=n+a[i];
writeln(n);
readln;
end.
标准的高精度乘法基础,应该不算长了。
但是,PE上面的一群职业程序员让我大开眼界。他们非常喜欢比较自己代码的长短。
昵称为bitRAKE 的一位用户使用Assembler语言编程,非常非常的长……
楼下就有一位来自瑞典的Dazen说:
” Easier in Python
sum = 0
for n in str(2**1000):
sum += int(n)
print sum “
我吓了一跳……发现pascal没有高精度确实弱了点。
接着3楼来自意大利的intinig使用的是Ruby:
” Even shorter in Ruby
sum = 0
(2**1000).to_s.each_byte {|b| sum+=b.chr.to_i}
puts sum “
我已经开始汗了,觉得自己的代码越来越丑……
4楼来自希腊的dionysis没有保持好队形,一大块的PHP源码(下面有一个一句话PHP代码,漂亮),我略过~5楼瑞典的ix使用Haskell语言给出了一个相当简短的解法:
sum (map (digitToInt) (show (2^1000)))
果然,它来了。
在所有解答里面最短小的是R.E. Boss使用的“J”语言(我没有听过……):+/"."0":2^1000x
到了第二页,发现了一个修改了R.E. Boss的解答的“cheater”: +/“.”0“:4^500x 少了一个字符~只有14格。
接下来还有很多 “one-liner”:
AND
reduce(lambda x, y: x + y, [int(i) for i in str(2 ** 1000)])
in Python
array_sum(str_split(bcpow(2,1000))) tt>
in PHP sum$map ord$show$2^1000
AND
summ = sum [ digitToInt x | x <- show(2^1000)]
in Haskell Plus@@IntegerDigits[2^1000]
in Mathematica
……
精彩的还有很多,我就不全部贴完了。大家解决了这道题的话(此乃最水高精题也),就可以到这个问题的讨论区里面——上面所有的见闻都在那里,相信还有更加精彩的高手用着迥异的风格来简短地书写诗意程序~
我深深体会到,原来高级语言可以写得如此地美丽。
P.S:博客Rss订阅的服务从feedsky更换到feedburner,地址也更新为http://feedproxy.google.com/programet
请订阅用户注意更换订阅链接。
本文由 严酷的魔王 创作,转载或引用前请联系我们。
相关文章:
标签:算法
程序首先要运行得快,而要有可读性,比短有啥意思呢。
不过很多语言里面提供的库函数的确很强大,这方面C/C++的确太弱了。
回复
不知道拿其他语言举办类似IOCCC的比赛
会有什么样咋舌的作品
回复
这点上perl无疑是最牛的
回复
J语言强…
回复
我是来挖坟的
回复
挖个西瓜…
回复
顺便一说这题我用wolfram|alpha做的
回复
[...] 其实这一切的开端都是Mgccl大牛作祟。在他的各种代码影响下,我就萌生了接触一点函数式编程的念头。其实还有一个原因便是我现在经常使用R语言做统计作业,但是R语言实际上是S语言的继承。本来S语言是一个函数式编程的语言,但是R这么一继承就变得有些不伦不类的……所以我也怀着“了解了函数式编程就能更好地学会R了吧!!”的情绪。最后,Haskell这个名字依然在三年前的《让我们比比长短》一文中出现了,这里函数式编程给我留下了各种深刻的印象。 [...]