
本帖最后由 ladace 于 2013-3-20 14:33 编辑
Project Euler 是一个某个老外做的“用程序解决数学题”的网站。
说实话,网站做得蛮丑的,而且刷网页服务器还经常傲娇。不过还算是挺火吧。。
题目还在更新中。
然后看了一下,发现题目都挺简单的。穷举啊。。稍微优化下啊,就能弄出来。跟NOI, ACM什么的没法比。
于是突然心血来潮,设置个挑战。
两行以内代码解决问题!!!!!!看看能做多远。
当然这两行不包括引用库的代码。。。。
因为没有限定语言,稍微降低了下难度。。。
设置这个挑战的目的呢。。就是为了表现函数式语言强大的表达能力,其次也是熟悉一下某些语言,找到这些语言的优势和劣势。
目前的代码都是 Haskell 和 J 语言写的。
1. 求小于1000的3, 5倍数之和。
Haskell代码:
2. 求四百万以下的斐波那契数列偶数值之和。sum [x|x <-[1..999], x `mod` 5 == 0 || x `mod` 3 == 0]斐波那契在 haskell 有一个经典的一行定义。
所以就很简单了:
3. 求 600851475143 的最大质因子。let fib = 1:2:zipWith (+) fib (tail fib) in用两行以内的 haskell 会跑很久。所以只好用了更火星文的 J 语言。内置操作:
4. 最大回文数,并且要是两个3位数的乘积。_1 {. q: 600851475143haskell 代码:
[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 语言:
6. 1 到 100 的平方和与和的平方之差。*./ 1+i.20这个好简单= =
haskell 代码。
7. 第10001个质数。let sqr x = x * x in (sqr . sum) [1..100] - sum (map sqr [1..100])实现了在 haskell 在无穷 list 上的筛选法求质数:
速度很慢就是了。result = (2 : sieve [3,5..]) !! 10000 wheresieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]
所以去看 J 语言。。结果发现:
好吧,是内置的操作 = =p: 100008. 找出一个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。
10. 求所有小于 2000000 的质数之和。result = concat $ map find [1..333] wherefind a = map (\b -> a * b * (1000 - a - b)) $ filter (\b -> a^2 + b^2 == (1000 - a - b)^2) [a..(1000 - a) `div` 2]
J 语言:
目前就更新前10题。+/ p: i._1 p: 2000000待续。。
其实你应该发在主版的
J之前貌似学过一下,不过太像乱码了
刚刚登了下projecteuler,发现我之前做过30多道题,当然没有限定2行内之类的
用projecteuler来练习编程真的很不错的
代码看了一点,先mark下,话说第二题的代码后面漏了点东西吧
haskell里有好多东西可以代替循环语句的,像filter,map,foldl,另外list comprehension和<$> <*>也很好用
[查看全文]