程序員必須挑戰的七大編程項目,你能挑戰幾個?
1)Sums
提示:針對這道題目,你需要采用一種技術,即使你已經擁有幾十年的編程經驗。從數據文件開始,列出每個年級、每個學校、每個城市、每個州中紅發學生的數量。你的任務是按數據進行排列,每個州(第一),城市(第二),學校(第三),最后按年級(K to 6)
- IDENTIFICATION DIVISION.{.js .plain}
- PROGRAM-ID. SUMS.{.js .plain}
- ENVIRONMENT DIVISION.{.js .plain}
- INPUT-OUTPUT SECTION.{.js .plain}
- FILE-CONTROL.{.js .plain}
- SELECT StudentFile ASSIGN TO {.js .plain}'input.txt'{.js .string}
- {.js .spaces}ORGANIZATION IS LINE SEQUENTIAL.{.js .plain}
- DATA DIVISION.{.js .plain}
- FILE SECTION.{.js .plain}
- FD StudentFile.{.js .plain}
- 01 StudentCount.{.js .plain}
- {.js .spaces}02 State PIC X(12).{.js .plain}
- {.js .spaces}02 City PIC X(18).{.js .plain}
- {.js .spaces}02 School PIC X(20).{.js .plain}
- {.js .spaces}02 Grade PIC X.{.js .plain}
- {.js .spaces}02 RedHaired PIC 9999.{.js .plain}
- WORKING-STORAGE SECTION.{.js .plain}
- […]{.js .plain}
- PROCEDURE DIVISION.{.js .plain}
- Begin.{.js .plain}
- {.js .spaces}OPEN INPUT StudentFile.{.js .plain}
- {.js .spaces}READ StudentFile{.js .plain}
- {.js .spaces}AT END MOVE HIGH-VALUES TO StudentCount{.js
- .plain}
- {.js .spaces}END-READ.{.js .plain}
- {.js .spaces}[…]{.js .plain}
- STOP RUN.{.js .plain}
下面是個輸入文件案例:
NY NYC PS 122 K1000{.js .plain}
NY NYC PS 122 12000{.js .plain}
NY NYC PS 122 43000{.js .plain}
NY NYC St-Judes 40043{.js .plain}
NY NYC St-Judes 50057{.js .plain}
NY Albany Green Acres K0003{.js .plain}
NY Albany Green Acres 20005{.js .plain}
NY Albany Green Acres 30010{.js .plain}
NY Albany Blue Hills 30123{.js .plain}
NY Albany Blue Hills 40302{.js .plain}
NY Albany Blue Hills 50067{.js .plain}
NY Rochester Happy Trails 50076{.js .plain}
- <b>Gives:</b>{.js .plain}
- {.js .spaces}PS 122 6000{.js .plain}
- {.js .spaces}St-Judes 100{.js .plain}
- {.js .spaces}NYC 6100{.js .plain}
- {.js .spaces}Green Acres 18{.js .plain}
- {.js .spaces}Blue Hills 492{.js .plain}
- {.js .spaces}Albany 510{.js .plain}
- {.js .spaces}Happy Trails 76{.js .plain}
- {.js .spaces}Rochester 76{.js .plain}
- {.js .spaces}NY 6686{.js .plain}
在這個例子中我采用了COBOL,使用固定的長度字段,數值填充為0。你可能會認為tab-
or comma-separated
input,當然這個值不一定非要為0。這個題目旨在增加正確值并在正確的時間顯示,而不是為了證明你可以輸入解析局部變量。請注意,這里的數據都是虛構的。
2) Fibonacci Sequence(斐波那契序列)
0, 1, 1, 2, 3, 5, 8, 13, 21…{.js .plain}
寫個函數返回到第n^th^的序列。這題應該是很容易。
3) Drawing with a Turtle
TurtleArt是創建該程序的其中一個,
其適合繪制各種圖片。你可以將“pen”移動至一個新的位置,改變畫筆的顏色,前進或者后退,隨意改變方向。此外,你還可以添加繪畫路徑,改變整個方形或者圓形色彩。這個挑戰就是利用TurtleArt來畫花。
下載TurtleArt:
- Microsoft Windows
- Mac OS X
- GNU/Linux (需要點擊 Java. Adjust進行設置)
你可以參照這幅圖片來進行繪制,當然你也可以自由創建。如果你認為這個很簡單,你還以嘗試繪制Michelle Deschênes:
4) 16-Puzzle
有時我們也稱其為15-puzzle拼圖,這個通常是由塑料制作而成的小玩具,采用4×4網格被分成15塊,每一塊都有圖片。游戲的目標是重新組合圖片以形成一個完成的圖像。
參考Wikipedia上9-puzzle的相關示例。
我們可以通過Scratch來編寫16-puzzle游戲。它與TurtleArt相類似,但不要你安裝軟件。你可以在線使用Scratch。
先不要急著挑戰高難度,由簡入繁,你可以先從2×2 puzzle開始,成功創建后再進行3×3,一步一步逐級增加,直到最終獲得完成16-puzzle。
5) Pascal Triangle(帕斯卡三角)
對于這個挑戰,通常會采用SQL來計算每一行的帕斯卡三角。
這個題目可能在我們童年時期見過,從1開始,1在頂部,第一個和最后一個都是1;接著每一行中間數字是由相鄰兩個數字之和,呈現金字塔形狀。
我們先定義一個表,這里使用MySQL語法,也可以采用任意SQL數據庫引擎:
- create table pascal ({.js .plain}
- {.js .spaces}row int not {.js .plain}null{.js .keyword},{.js .plain}
- {.js .spaces}entry int not {.js .plain}null{.js .keyword},{.js
- .plain}
- {.js .spaces}val int not {.js .plain}null{.js .keyword},{.js .plain}
- {.js .spaces}primary key (row, entry){.js .plain}
- );{.js .plain}
先初始化前兩行,從技術上來講,你只真正需要第一個,從第三行開始變得很容易,實際上你已經從上一行開始計算值。
- insert into pascal values (1, 1, 1);{.js .plain}
- insert into pascal values (2, 1, 1);{.js .plain}
- insert into pascal values (2, 2, 1);{.js .plain}
你可以使用存儲過程( stored
procedure)來填寫 n^th^行,或者你也可以使用宿主語言(host
language)比如PHP或Java來調用數據庫。記住,不要使用任何(flow control
)流量控制(比如ifs, loops等),不要調用遞歸函數,你可以采用insert
statements。
mysql> select * from pascal where row = 10;{.js .plain}
當然,只要你愿意,你也可以采用NoSQL數據庫。
6) Sierpiński Triangle (謝爾賓斯基三角形 )
這個得名來源于波蘭數學家 Wacław Franciszek Sierpiński(波蘭語,謝爾賓斯基),有三個著名的分形是以他的名字命名(Sierpinski三角形,Sierpinski地毯,Sierpinski曲線),創建于1915年。
繪制這個,你需要從一個等邊三角形(equilateral triangle)開始,然后給其填充顏色,然后挖空三角形中間部分,這樣中間的三角形是其他三個三角形的邊。從9個三角形增加至27個,以此類推。
你也可以在HTML5 canvas中繪制,首先你要決定canvas的形狀及大小以及三角形坐標。
如果每個邊有長度x,長度h,那么就可通過從頂點畫線,這樣使它底部的邊緣交叉成直角,可以采用應用勾股定理找到h至x的比例。
如果你不想采用數學原理,那么你還可以使用canvas設定寬220,高195,三角形頂點 (10, 185),(210, 185),(110,
10)。當你完成一個基本的三角形工作,添加一個小動畫。使其呈現出不同的效果,你可以看到它是如何一步一步實現的。
完成三角形后,你還可以嘗試 Sierpiński carpet(Sierpinski地毯)。
道理是同樣的,從一個正方形開始,把它分成9個正方形。挖空中間,和其他8個正方形構成carpet。
7) Project Euler
Project Euler由Colin Hughes(也被人稱為euler) 在2001年10月創建,一開始時作為mathschallenge網站的一個子欄目。它是一個具有挑戰性的不僅僅需要具備數學能力的“數學/計算機編程”問題集合。
Project Euler致力于鼓勵、挑戰并且發展解題技巧,并且為那些對迷人的數學世界有興趣的人提供樂趣。
Project Euler提供的問題集有不同的難度以及多種解題經驗,可以進行連續的啟發式的學習。也就是說,通過解決一個問題,提供給解題者一個新的概念,使解題者可以接觸之前無法涉及的問題。因此,有毅力的參與者將會逐一完成每一個題目。
最后:
試試你能挑戰幾個吧?希望這些挑戰能夠激發你的好奇心,通過它們擴大視野,幫助你創造性的思考問題,因為軟件開發本身就是個創造性的過程。