ladace
【挑战】两行以内代码解决 Project Euler 上前25或50题!更新中

本帖最后由 ladace 于 2013-3-20 14:33 编辑

Project Euler 是一个某个老外做的“用程序解决数学题”的网站。

网址:http://projecteuler.net/

说实话,网站做得蛮丑的,而且刷网页服务器还经常傲娇。不过还算是挺火吧。。

题目还在更新中。

然后看了一下,发现题目都挺简单的。穷举啊。。稍微优化下啊,就能弄出来。跟NOI, ACM什么的没法比。

于是突然心血来潮,设置个挑战。

两行以内代码解决问题!!!!!!看看能做多远。

当然这两行不包括引用库的代码。。。。

因为没有限定语言,稍微降低了下难度。。。

设置这个挑战的目的呢。。就是为了表现函数式语言强大的表达能力,其次也是熟悉一下某些语言,找到这些语言的优势和劣势。

目前的代码都是 Haskell 和 J 语言写的。

1. 求小于1000的3, 5倍数之和。

Haskell代码:

sum [x|x <-[1..999], x `mod` 5 == 0 || x `mod` 3 == 0]
2. 求四百万以下的斐波那契数列偶数值之和。

斐波那契在 haskell 有一个经典的一行定义。

所以就很简单了:

let fib = 1:2:zipWith (+) fib (tail fib) in
3. 求 600851475143 的最大质因子。

用两行以内的 haskell 会跑很久。所以只好用了更火星文的 J 语言。内置操作:

_1 {. q: 600851475143
4. 最大回文数,并且要是两个3位数的乘积。

haskell 代码:

[mw_shl_code=haskell,true]maximum $ filter (\x-> show x == reverse (show x)) $ (*) <$> [100..999] <*> [100..999][/mw_shl_code]

5. 1 到 20 的最小公倍数。

一想到这是 J 语言内置功能就直接用了。

J 语言:

*./ 1+i.20
6. 1 到 100 的平方和与和的平方之差。

这个好简单= =

haskell 代码。

let sqr x = x * x in (sqr . sum) [1..100] - sum (map sqr [1..100])
7. 第10001个质数。

实现了在 haskell 在无穷 list 上的筛选法求质数:

result = (2 : sieve [3,5..]) !! 10000 where

sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

速度很慢就是了。

所以去看 J 语言。。结果发现:

p: 10000
好吧,是内置的操作 = =

8. 找出一个1000位的数中连续5位,使得它们的积最大。求它们的积。

因为数字很大,所以放在"data"文件里了。

[mw_shl_code=haskell,true]maximum . map product . filter (\e -> length e == 5) . map (take 5) . tails

. map digitToInt . concat . lines <$> readFile "data"[/mw_shl_code]

9. 求勾股数 a b c 的积且满足 a + b + c = 1000。

result = concat $ map find [1..333] where

find a = map (\b -> a * b * (1000 - a - b)) $ filter (\b -> a^2 + b^2 == (1000 - a - b)^2) [a..(1000 - a) `div` 2]

10. 求所有小于 2000000 的质数之和。

J 语言:

+/ p: i._1 p: 2000000
目前就更新前10题。

待续。。