推薦網站Project Euler:思考的樂趣&計算的樂趣
按:本文作者未經正式程式設計訓練,數學底子也不牢,只是個野路子學習愛好者,自然逃不了“ACMer面前刷水題”的無力感,還請列位看官多多包涵~
何為Project Euler?
"Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with an interest in the fascinating world of mathematics."
ProjectEuler.net是一個好玩的網站!上面有許多數值計算題,比如小於一百萬的數裡面有多少個數在十進位制下和二進位制下都是迴文數。從2006年(甚至之前沒有獨立域名的時候)開始,就已經有不少使用者了;不過那時候我還沒把學習程式設計提上日程……
解法不限語言,不限程式碼複雜度,使用者只需要提交數值答案即可。如果答案正確,則使用者可以進入該題的討論帖,看看其他人對題目有什麼分析,用了什麼解法,寫了什麼程式碼。
這就意味著提供了一種以問題為導向的程式設計學習方式!
Project Euler面向什麼樣的使用者呢?
平時上課無法滿足求知慾的學生,不是學數學出身的成年數學愛好者,希望不斷磨礪解題能力和數學水平的職業人士。
從公開的資料來看,目前似乎使用C/C++或Python的使用者最多,不過在論壇裡,Mathematica、Haskell、APL甚至彙編等等也都很搶眼,當然還有最最風騷的Pencil/Paper。
網站有等級和勳章系統,每答對25題升一級,還有奇奇怪怪的勳章(比如解出第3、14、15、92、65……題可以獲得As Easy As Pi成就),算是小小的激勵和樂趣吧。不過最大的樂趣和成就感當然還是來自解題本身!
從何處下手?
兩條原則:
- 一般來說,成功解題的人越多,就說明題目越容易;但是難易定義是相對的。
- 一般來說,題號越大,題目可能越難;但是題目難度並非嚴格遞增,比如說第357題其實非常簡單。另外有些題是有一定關聯的,比如多邊形數的題目就有好多道,連分數的題目也是,循序漸進會輕鬆一些。
做題步驟大概就是審題,想清楚題目設定,從簡單情況推一下看看有什麼結論,考慮遍歷順序什麼的,然後有些簡單題可以筆算,有些題需要編碼。最後,提交答案,哦也!
我一般會提前讀好幾道題,在腦袋裡面放著,有時候走在路上靈光一現,沒準就有思路了。當然跟讀完題就有清晰思路的大牛沒法比……
智商不夠,暴力來湊
大部分題目看起來都可以直接寫出窮舉的暴力解法,有些題目也確實可以這樣解決。但是我們對P/NP問題還是有點概念的,這樣硬算有可能一輩子都算不完。所以請務必注意!題目設計有個所謂的“一分鐘原則”:
設計出一則成功的演算法,可能需要花掉好多個小時;但是有了高效的實現,那麼靠譜的機器應該能在一分鐘內求出解來。
數學是基礎,暴力是輔助。一方面,磨刀不誤砍柴工,複習演算法+學點數論、圖論、組合知識才是王道;另一方面,如果一分鐘算不出來,說明你的設計八成不太靠譜……
當然了,對於我這種時不時智商捉急又無法充值的人來說,有時候只能勉強把程式碼優化到可以跑出結果的地步(有的題跑過幾小時我會說麼),再去論壇裡觀摩高手的做法……
不會做,腫麼破?
有時絞盡腦汁也沒思路,寫了一堆迴圈,彷彿根本沒辦法在有生之年算完;或者好不容易寫出來了,怎麼算都得不到正確答案。
恭喜你!這說明你有機會學到新東西!
在這種情況下,官方給出的hint是:
非常非常仔細地讀題,尤其是仔細觀察給出的例子。用紙筆演算一番,試著體會題目背後的思想。如果不熟悉這些思想,上網搜尋或者查閱圖書,補補背景知識;仔細讀題就會知道應該查什麼東西。寫個程式,試試看能不能搞定簡單情形,輸出是不是符合示例;如果順利,你就知道自己確實理解了題目,沒走錯方向。然後,試著推算求解原題所需時間。假如遠遠超過一分鐘,那麼請重新考慮解題策略。
作為一隻小弱,我再補充幾句:
- 仔細審題!有時候題目表述可能有點問題,比如第17題(數字單詞字數);有時候邊界特殊情況需要謹慎考慮。
- 搜尋知識,不要搜尋答案!比如跟某些數列有關的題目,答案或許可以直接搜到,但是這有何意義呢?如果要搜尋,不如看看這個數列有什麼數學性質可以用吧。
- 會做的題目也要看看討論,看看自己的方法能否進一步優化,說不定你會發現神奇的技巧。
- 至於直接抄程式碼什麼的——你確定真的要剝奪自己Eureka的樂趣嗎?!
- 存幾個常用數表備用(比如N以內的素數表)。
- 對於各種複雜度的執行時間,大概有點概念。
- 找本OI教材,上手或許較快。
最重要的……
現在,Project Euler有超過35萬註冊使用者解出至少1道題,其中解出3道題的人大約16萬,但解出25道題成功升級的就只剩下不足6萬了,而這6萬人大部分一直停留在Lv. 1。作為刷到Lv. 3的Python小白,甚感欣慰(咳咳)……
這樣的資料當然毫不令人意外。
每當有人寫東西介紹Project Euler,總會引起一波註冊熱潮,但是這樣的雞血有多少後勁呢?你大概還記得有個妹子180天做180個網站自學程式設計的故事吧。當時你是不是也蠢蠢欲動、準備學coding來著?然後呢?
別忘了那個已經走上碼農之路的妹子說的:Start small & keep building!
以上!
相關文章
- 樂趣在於思考
- 製作遊戲的遊戲:創作樂趣的樂趣遊戲
- 一本書的推薦序——寫在《思考的樂趣》即將上市之際
- 愛上數學的理由——評《思考的樂趣》
- 手繪小插畫之思考的樂趣(1)
- 手繪小插畫之思考的樂趣(2)
- 多出來的50% Imagination——思考的樂趣
- 【演算法的樂趣】演算法
- 閱讀原始碼的樂趣原始碼
- 重拾 CSS 的樂趣(下)CSS
- 重拾 CSS 的樂趣(上)CSS
- 維護程式的那些樂趣
- 享受工具帶來的樂趣
- 享受工作樂趣(轉)
- 手繪小插畫之思考的樂趣(未用小稿)
- 添趣網!搞笑, 視訊, 音樂 網站,wap跟pc模板!網站
- 開放出版:《思考的樂趣:matrix67數學筆記》筆記
- 數學也有數學的魅力 文科生讀《思考的樂趣》
- 傳奇程式設計師Larry Wall:Perl的樂趣程式設計師
- 遊戲不應該只有樂趣遊戲
- 遊戲設計:如何讓玩家獲得樂趣遊戲設計
- 傳奇程式設計師Larry Wall:Perl的樂趣 (轉)程式設計師
- Java我的三個月——OOP的樂趣 (轉)JavaOOP
- 程式猿放鬆娛樂必去的7個網站推薦網站
- 趣文:計算機網路基本概念趣解計算機網路
- 開放出版《思考的樂趣:matrix67數學筆記》樣章1筆記
- 能從遠端獲得樂趣的 Linux 命令Linux
- 遊戲,一個有樂趣的、解決問題的過程遊戲
- 走出浮躁的泥沼:學會享受學習過程的樂趣
- 郝培強(@Tinyfool):創造的樂趣(圖靈訪談)圖靈
- 敲程式碼是件痛苦還是有樂趣的事?
- 漫談程式設計師系列:軟體開發的十八般樂趣程式設計師
- 終端中的樂趣:6個有趣的Linux命令列工具Linux命令列
- 擁有一個永遠無法實現的想法的樂趣
- C++之父:將工作視為一種樂趣C++
- 韋樂平:雲網融合的思考
- 從OC和C#中找樂趣:相同又不同的delegateC#
- 引爆你的網頁樂趣!前端十個令人捧腹的JavaScript整蠱程式碼。網頁前端JavaScript