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题。

待续。。

yourgoodlife
感谢楼主分享
展开Biu

感谢楼主分享

:33:

[查看全文]
zxwglzi
表示不会
展开Biu

表示不会haskell 马克一下

[查看全文]
郁闷的ZERQ
两行之内
展开Biu

两行之内,难度略大,留名纪念一下吧

[查看全文]
Mr_Alex
我怎么看着都像乱码
展开Biu

额 我怎么看着都像乱码 @86#

[查看全文]
轻舟过
写多了论坛显示会出
展开Biu

ladace 发表于 2013-3-20 14:36

写多了论坛显示会出bug,不知道为什么。。

改了很久。。

第二题补上了。

可能是尖括号被当成html标签了?

J实在是太奇葩了

[查看全文]
ladace
其实你应该发在主版的
展开Biu

轻舟过 发表于 2013-3-20 14:11

其实你应该发在主版的

J之前貌似学过一下,不过太像乱码了

刚刚登了下projecteuler,发现我之前做过30多道 ...

<$> 写多了论坛显示会出bug,不知道为什么。。

改了很久。。

第二题补上了。

J 写什么都是一行。。写出来都是没人懂的乱码。。。

[查看全文]
轻舟过
其实你应该发在主版的
展开Biu

其实你应该发在主版的

J之前貌似学过一下,不过太像乱码了

刚刚登了下projecteuler,发现我之前做过30多道题,当然没有限定2行内之类的

用projecteuler来练习编程真的很不错的

代码看了一点,先mark下,话说第二题的代码后面漏了点东西吧

haskell里有好多东西可以代替循环语句的,像filter,map,foldl,另外list comprehension和<$> <*>也很好用

[查看全文]
ladace