有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 1375|回复: 8
收起左侧

[普通教程] 【挑战】两行以内代码解决 Project Euler 上前25或50题!更新中

 关闭 [复制链接]

签到天数: 4 天

连续签到: 1 天

[LV.2]偶尔看看I

48

主题

89

好友

1万

积分

抚琴台 · 羽徽

积分
15767
发表于 2013-3-20 12:37:46 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

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

Project Euler 是一个某个老外做的“用程序解决数学题”的网站。
网址:http://projecteuler.net/

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

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

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

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

当然这两行不包括引用库的代码。。。。
因为没有限定语言,稍微降低了下难度。。。
设置这个挑战的目的呢。。就是为了表现函数式语言强大的表达能力,其次也是熟悉一下某些语言,找到这些语言的优势和劣势。

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


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

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

斐波那契在 haskell 有一个经典的一行定义。
所以就很简单了:
  1. let fib = 1:2:zipWith (+) fib (tail fib) in
复制代码
3. 求 600851475143 的最大质因子。

用两行以内的 haskell 会跑很久。所以只好用了更火星文的 J 语言。内置操作:
  1. _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. *./ 1+i.20
复制代码
6. 1 到 100 的平方和与和的平方之差。
这个好简单= =
haskell 代码。
  1. let sqr x = x * x in (sqr . sum) [1..100] - sum (map sqr [1..100])
复制代码
7. 第10001个质数。

实现了在 haskell 在无穷 list 上的筛选法求质数:
  1. result = (2 : sieve [3,5..]) !! 10000 where
  2.     sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]
复制代码
速度很慢就是了。

所以去看 J 语言。。结果发现:
  1. 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。
  1. result = concat $ map find [1..333] where
  2.     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 语言:
  1. +/ p: i._1 p: 2000000
复制代码
目前就更新前10题。

待续。。

对不起,这不是你期待的明天。我游戏怎么还没做完
回复

使用道具 举报

签到天数: 4 天

连续签到: 1 天

[LV.2]偶尔看看I

48

主题

89

好友

1万

积分

抚琴台 · 羽徽

积分
15767
 楼主| 发表于 2013-3-20 12:38:20 | 显示全部楼层
占楼。。 @轻舟过
对不起,这不是你期待的明天。我游戏怎么还没做完
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
发表于 2013-3-20 14:11:06 | 显示全部楼层
其实你应该发在主版的
J之前貌似学过一下,不过太像乱码了
刚刚登了下projecteuler,发现我之前做过30多道题,当然没有限定2行内之类的
用projecteuler来练习编程真的很不错的

代码看了一点,先mark下,话说第二题的代码后面漏了点东西吧
haskell里有好多东西可以代替循环语句的,像filter,map,foldl,另外list comprehension和<$> <*>也很好用

博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

签到天数: 4 天

连续签到: 1 天

[LV.2]偶尔看看I

48

主题

89

好友

1万

积分

抚琴台 · 羽徽

积分
15767
 楼主| 发表于 2013-3-20 14:36:19 | 显示全部楼层

<$> 写多了论坛显示会出bug,不知道为什么。。
改了很久。。
第二题补上了。

J 写什么都是一行。。写出来都是没人懂的乱码。。。
对不起,这不是你期待的明天。我游戏怎么还没做完
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
发表于 2013-3-20 14:46:33 | 显示全部楼层
ladace 发表于 2013-3-20 14:36
写多了论坛显示会出bug,不知道为什么。。
改了很久。。
第二题补上了。

可能是尖括号被当成html标签了?
J实在是太奇葩了
博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

签到天数: 3 天

连续签到: 1 天

[LV.2]偶尔看看I

41

主题

60

好友

2万

积分

第一章

守望者

积分
21763
发表于 2013-3-20 21:00:04 | 显示全部楼层
额 我怎么看着都像乱码  
如果有来生,要做一棵树,站成永恒,没有悲欢的姿势。一半在土里安详,一半在风里飞扬,一半洒落阴凉,一半沐浴阳光,非常沉默非常骄傲,从不依靠从不寻找。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

11

好友

1614

积分

Continue

积分
1614
发表于 2013-4-30 00:34:06 | 显示全部楼层
两行之内,难度略大,留名纪念一下吧
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

11

好友

2040

积分

Continue

积分
2040
发表于 2014-2-20 12:36:24 | 显示全部楼层
表示不会haskell 马克一下
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

69

主题

30

好友

1万

积分

第一章

积分
12439
发表于 2014-12-10 11:08:30 | 显示全部楼层
感谢楼主分享   
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(基宅) ( 粤ICP备18082987号-1 | 浙公网安备 33010902001746号 )

GMT+8, 2024-4-26 23:11 , Processed in 0.183338 second(s), 21 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表