两周前看到“推荐几个好玩又有难度的编程网站”这篇文章,对里面提到的几个编程网站都进去看了一下,明显对做者首推的Project Euler(http://projecteuler.net/)编程网站颇有兴趣——“一分钟原则”、只要求结果正确、都是描述简短明了的数学题。下面会给出我的认为Project Euler更有意思的特色。php
比ACM OJ要求少、题目类型单1、任意语言实现python
我曾经在ZOJ(浙江大学ACM在线评测,英文题目)、zjut(浙江工业大学ACM在线评测,中文题目)两个国内比较突出的ACM编程网站分别作过前面简单的那么20来道题目,花了很多时间。
算法
当时是刚开始接触并尝试ACM题目,作的都是前面偏简单的入门题目,但却花了大部分时间在反复详细阅读较大篇幅的题目描述、检查并调整结果输出格式、猜想可能被忽略的关键点、注释掉调试语句、“试图”用网站上不一样的编译器(只能用C或C++)提交代码...
编程
然而上面这些让我感到繁杂(其实也是更锻炼作题者)的特色,在Project Euler中不复存在,缘由在于Project Euler所有都是“mathematical/computer programming problems”,题目描述简短明了,而且只须要你输入惟一正确的答案、输入验证码,点击提交便可——无论你用什么方式(手工演算推导、各类编程语言)获得答案(固然搜索现成的答案一点意思都没有!)。 浏览器
具体介绍请参考about页面(http://projecteuler.net/index.php?section=about),摘取其末尾一句话——“Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with an interest in the fascinating world of mathematics.” app
推荐像我这样子“非职业的”ACM参赛学生经过Project Euler练习编程技能、锻炼思考/分析能力。编程语言
论坛讨论、官方解答ide
一旦你提交的答案经过,Project Euler会给出该题目的论坛详细记录,里面是之前解题者的思路、方案、讨论、实现的详细信息,你可以在这里看到你们用各类“莫名其妙”的编程语言(汇编、APL/J/K...)的完整实现,或者一些思路的交流,以此来完善你的实现、吸取更妙的思考、解法。函数
此外,部分题目经过后还会给出“官方解答”(一个针对该题的PDF文件,可下载),里面主要是一些推导、伪代码实现、参考连接等。网站
所以,你彻底能够本身用“蛮力法”求得正解以后做为“敲门砖”,提交经过得到上面所述的“福利”。一位外国软件工程师在这里也说“can be either solved by a simple brute-force approach”,同时也推荐他的这个博客。
实际上,目前我完成了的30几道题有一部分就是经过简单直接的解法获得答案的,想要改进时再到论坛去认真转一转,确定会收益很多。
题目总数与发布
对了,目前Project Euler中共有340道题目,大概每周发布一道新题。你能够按照ID(发布时间)、difficulty(solved人数)对题目进行升降序排列,方便查看。
个人操做方式与一点点体会
正由于题目描述简短,我用手机上的UC浏览器保存了details of all problems页面,在食堂、车站排队无聊时拿出来理解一道题目,而后思考一下找寻解题思路,回到宿舍再在草稿纸上画一画,最后才写代码实现求解。
还记得我在Problem 18的递归解法中的bug就是我早上起来刷牙时忽然想到的(归功于前一晚睡觉前也纠结了一下这个bug)。我想这也是“暗时间”的利用方式,并且思考可以避免焦虑,不会去想今天食堂怎么这么多人排队 ; )
Project Euler只要求惟一的正解,因而我用简洁而强大的Python(初学者)来写代码,这篇文章“松本行弘为何要开发Ruby”提到Ruby不作明确的数据类型定义,没必要要的声明均可以省略,能够专一于算法。我想这对Python也是同样的,都是动态类型的脚本语言,在解题方面效率的确是高不少。当我不知道Python中有chr()与ord()这两个char与int互转的内置函数时,改用Java实现时有多少似嫌多余的代码啊。很明显我也所以愈来愈喜欢上Python了 ; )
说来也真巧,我又看到与最前面那篇“推荐几个好玩又有难度的编程网站”同一做者赖勇浩前辈的另外一篇文章——“使用 Python能延长你的生命”。
一直都是按ascending order of difficulty(solved人数)从易到难作题的,认为别人能作到的本身也应该努力作到,可是发现其实有些solved人数少的题其实也并不比当前solved人数多的题更难。因而以为别人没经过的题不必定表明了本身也没能力解决,对别人容易的题目本身作起来也不必定简单。归根结底这是一个坚持与积累的过程。
个人不足
在两周多有趣的解题过程当中,渐渐地发现了本身的一些坏习惯,应该重视并改掉。
1、习惯长期纠结于某道已经有思路、写了代码却得不到正解的题目而不肯意放下,实际上这样子时间、精力都耗费得更多。这种时候尝试一下另外一道题或者刚才放下隔两三天再回头思考更有益,例如又是用到递归的Problem 24。
2、虽说用Python实现更加简洁,但也更加随意,所以存在“巧合编程”的习惯,循环计数改成+1或 -1。并且几乎没有写注释,趁着解决的题目还很少,要考虑整理一下全部脚本代码放到google code上去。
Project Euler其余有趣的特色
看下图以及其底部的note(http://projecteuler.net/index.php?section=scores),要完成100道题才能称得上Novice(初学者、入门者)Level 3级别啊。看起来我才Level 1就在这里吵闹真是...坚持啊积累啊!
下图有当前登陆者的解题数量进度条(进度条能让你明确到了那个阶段,不至于打击你的自信与动力),究竟是新题发布得快仍是咱们本身解题速度更快呢?一点一点慢慢遇上吧。
在Statistics(http://projecteuler.net/index.php?section=statistics)页面中,统计了各个国家的注册用户与编程语言的使用状况。美国有15843 注册用户,中国是其1/9有1686,粗略一看,排得上前五了。另外有53种编程语言被使用了。我的以为稍微看看这些信息还挺有意思的,但愿愈来愈多的同窗们在Project Euler注册开始解题啊。
最最后一个疑问?
Euler是啥意思?哈,我又很巧地在经典之做 《几率论及其应用》的人名翻译对照表中看到“尤拉”这个名字,数学家来的,上上面那张头像是也,上 Wikipedia 查查吧。