最近liangent向我推荐了一个编程解题的网站:ProjectEuler.大家都知道,Euler就是欧拉,有史以来最伟大的数学家之一。这个网站的题目都是和数字有关的。我刚刚开始做,发现上面有一群职业的程序员,非常有意思。

上面的第十六题是这样的:215 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26. What is the sum of the digits of the number 21000?

不难,我用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”:

sum(int(digit) for digit in str(2**1000))
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
请订阅用户注意更换订阅链接。

本文由 严酷的魔王 创作,转载或引用前请联系我们

相关文章:

  1. Google Code Jam 2010 尝鲜
  2. 谜之系列(0):线性规划
  3. Euler筛法
  4. NOIP实用算法 1.模拟方法
  5. WINDOWS下搭建中文TeX环境

标签:

2008年10月21日 星期二

8条评论

留下您的足迹

2008 f(Program,Poet)=Programet.
Powered by Wordpress. Theme by Pharmacy Drugs and LastLeaf.