- UID
- 91226
- 在线时间
- 0 小时
- 最后登录
- 2018-8-6
- 注册时间
- 2012-4-13
- 宅魂
- 918 点
- 贡献
- 404 点
- 宅币
- 10250 枚
- 宅の石(入宅度)
- 0 块
- 元气(技能点)
- 30 点
- 活跃
- 41 ℃
- 听众
- 12
- 收听
- 12
签到天数: 4 天 连续签到: 1 天 [LV.2]偶尔看看I
抚琴台 · 羽徽
- 积分
- 15767
|
本帖最后由 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 语言。内置操作: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 语言: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 语言。。结果发现:好吧,是内置的操作 = =
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 语言:目前就更新前10题。
待续。。
|
|