Project Euler是一个quiz站点,每个月发布两个题目,大部分属于花上几分钟最多几十分钟,写上几行的代码就可以解决的问题,一旦提交的答案正确了就可以进入这个题目的讨论thread,看看各种五花八门的解法,既可以只关心你喜欢或者擅长的语言,也可以看看不那么熟悉的语言里这问题可以怎么干;你还可以看看按照国家、擅长语言统计的解题情况——也有人最喜欢的是纸和笔(pencil and paper),这种一般大概都是大牛。
题目的设计难易搭配,有些题目解法很多,可以暴力穷举(brutal force)也可以有巧妙的算法实现成千上万倍的性能优化,这种就属于比较简单的,因为可以不用什么脑子,用程序把题目表述出来然后运算就行了——只是这个站点有个不成文的规矩,1-min rule,也就是程序运行时间不可以超过1分钟,不然算法肯定是有问题,就算得到答案也不算过关(当然这只是君子协定,系统本身只认结果,哪怕你是偷看来的也算 >_< )。有些题目就不一样了,你没有找到正确的路线根本不要指望可以算得出结果,如果暴力求解别说一分钟,几百年也得不到答案,算法的力量太可怕了,不信可以试试第67题,之前有个一模一样的第18题,但是规模小很多,穷举都可以,但是这个67题不行了,出题者告诉你要蛮干得算上几百亿年(汗),这种就属于有点难度的了,需要脑子好使。顺便说句,这个题目解法极其简洁而优美,非常符合Joe Marshall讲的Programming is Art的观点。
还有些题目是需要比较深的数学功底,花上不少时间才能理出头绪的,最新的两个题目(第175题和第176题)都属于这一类,至少我在解题过程中程序占的比重远不如纸和笔,有兴趣的可以体验下。
另外一个体会是,在这种问题面前,动态语言的优势很大,可以很快的进入问题本质,例如上面说的67题,要你读入一个数据文件,里面是100层的一个三角数阵,用Ruby——我做这些题目只用Ruby,顺便学习语言特性——就是这样(图片是从TextMate里截的,关于这个伟大的编辑器我们以后再说,我会慢慢持续的放点Mac毒的,嗯):
读入数据文件然后拆成一个多维数组放好了,我不知道用Java或者C之类的要多少代码才能做好这个。
最近工作累了就上去做几题,一般来说都会起到醒神洗脑之功效,有类似癖好者不妨一试——当然,也可能会有不良反应,风险自担 >_<