兩週前看到「推薦幾個好玩又有難度的編程網站」這篇文章,對裏面提到的幾個編程網站都進去看了一下,明顯對做者首推的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 查查吧。