iT邦幫忙

6

心原一馬從零帶你認識線上解題系統- 專為新手設計的OJ 初體驗

大家好,我是「心原一馬」,內心原來一心喜歡打程式碼。
我們都知道學任何一項技術都是熟能生巧的,
需要透過不斷的實作練習來增進自己的實力。

譬如學外語好了,怎麼樣進步的最快呢?
小馬聽過的說法是說出國遊學學的最快,
因為在那個環境每個人都講那種語言,
為了能夠跟人對話,環境就強迫自己開口講話,
久了之後就愈講愈好了。

語言=>跟人講話; 程式語言=>跟電腦講話

小馬覺得其實「語言」和「程式語言」是有相似之處的,
一個是用來跟人講話,一個用來跟電腦講話。
所以想要讓程式語言進步,
就是多多練習「跟電腦講話」囉~
但是新手面臨最大的問題是-
「我不知道可以練什麼啊?」
跟人講話還可以聊天,
但是對於要跟「一個指令一個動作」的電腦講話,
簡直像【Python 超入門】(10) 自定義函數介紹- 主人向他的機器人管家抱怨:「你跟我這麼多年了,也該了解我們家的習慣了吧?」故事中描述的小白一樣,
讓人森77呢~
還好現在有online jugde的出現,
可說是學程式族群想練習的一大福音呢。

什麼是Online Jugde?

中文為「線上解題系統」,英文簡稱OJ,
簡單來說,OJ上有很多程式題目,
使用者可以把自己的程式碼繳交到OJ上,
OJ會判斷使用者的程式輸出的答案是否正確。

那那…會不會跟準備大考買參考書做考古題一樣無聊啊?

這可能也是新手會怯步的地方,
一聽到「做題目」,
可能想起了各種「基測」、「學測」、「指考」年代,
當年為了進入理想學校在考前一年寒窗苦讀…

No~ 我覺得做OJ跟為了考試苦讀感覺差多了,
因為OJ現在題目多半故事生動,很生活化,
還有「討論區」可以看別人分享的想法或答案。

OJ的樂趣

小馬是覺得解OJ就像玩遊戲解任務一樣有趣,

  • 解OJ具有互動性
    你可以線上即時繳交你的程式碼,
    彷彿玩遊戲跟關主互動一樣,
    關主會告訴你通過幾筆測資,沒通過幾筆,
    從沒通過的部分你可以去試著找程式碼的錯誤。

  • 解OJ就像遊戲闖關
    相信很多人如果玩一款遊戲,
    看到自己從本來是菜鳥,解鎖到後面的遊戲關卡,
    都會很有成就感吧?
    很多OJ上都有排行榜,也可以記錄自己完成了多少題目(破了多少關卡),
    如果你從本來剛註冊解了0道題,玩到後來解了100道題,
    那簡直看到了自己從程式小白晉升到程式達人的喜稅啊~

  • 解OJ具有自由性
    同一個問題你可以有不同的解法來破關,
    所有你學過的程式語法都可以做為武器使用,
    不論黑程式,白程式,能解決問題的就是好程式。
    當你語法愈學愈深入時,
    你可能會發現類似的問題能夠愈寫愈簡潔,
    彷彿你打怪的裝備還能升級一樣。

  • 解OJ可以是興趣
    很多人會覺得奇怪,寫OJ不就是一直解題嗎?
    為何小馬講的彷彿能飛天遁地?
    尤其是可能有些人是資工相關科系出身,
    校內都有自己的OJ,而
    助教在OJ上的題目出得艱澀難解,
    題目寫不出來那門課的分數就會受難,
    怎能感受OJ有什麼趣味性呢?
    (小馬也是資工相關科系出身,很能體會這種感受~)
    但…如果你曾被益智遊戲吸引,(例如: 數獨、象棋殘局…)
    或許能理解為什麼解題是有樂趣的。

接下來小馬老師要介紹一個專為程式初心者設計的OJ- zerojudge,
題目由淺入深,只要對程式有基礎概念即可上手。
程式老鳥也不必擔心無聊,你可以直接到其它進階的題庫尋找適合自己程度的問題。

OJ初體驗- 高中生程式解題系統

網站名: 高中生程式解題系統(zerojudge)
入門難易度: ★
題目趣味性: ★★★
需另外註冊?: 否,可直接用google帳號登入。
語言: 中文
可用解題語言: C, C++, java, pascal, python
網址: https://zerojudge.tw/

目前網路上已經有很有OJ可以供人練習了(如LeetCode, UVa...),
但是對於程式新手或是自學程式的人來說有個普遍的問題-太難
嘗試了一下後可能一、兩個小時解不出來,
然後得到滿滿的挫折感,
「我果然不適合寫程式吧~」的想法從心中油然而生。

你可以試試這個專為新手設計的平台,
網頁標榜說它是「適合所有中學生及初學者的OJ系統」,
進入網頁後,你會看到這樣的頁面:

https://ithelp.ithome.com.tw/upload/images/20190715/20117114HwBbR7yfwv.png

初次使用建議看一下網站上的「使用手冊」,
它有詳細的教學如何讀測資。
按下「分類題庫」按鈕後可以看到各式題庫,如下圖:

https://ithelp.ithome.com.tw/upload/images/20190715/20117114oORaaJ3VMV.png

(建議初學者從「基礎題庫」開始)

右上角有個「登入」按鈕,可以用google帳號登入:

https://ithelp.ithome.com.tw/upload/images/20190715/20117114P9YbjSXXLM.png

登入後就可以開始做題目囉~
例如我們點進基礎題庫的編號第一題 a001. 哈囉
看到題目如下:

https://ithelp.ithome.com.tw/upload/images/20190715/20117114IV7wJYjYhh.png

底下有個「送出解答」按鈕,
按下去之後會看到:

https://ithelp.ithome.com.tw/upload/images/20190715/201171148v1tgdXPKS.png

然後就可以選擇自己熟悉的程式語言來解題囉。
基本上我覺得輸入輸出(input/output)一開始可能會不太熟悉,
習慣了之後應該就可以順利解題了。

分享一個小馬喜歡的解法,(跟範例不一樣哦~)
基礎格式如下:

while True:
    try:
        讀入系統測資 (用input()函數)
        …           (一些做運算的程式碼)
        輸出結果    (用print()函數)
    except:
        break

while True是無窮迴圈,
可以達到一直讀測資的效果,
迴圈內使用 try...except的語法,
try裡面,程式會嘗試讀測資,
如果讀不到,就進入except跳出迴圈。

所以這一題可以這樣寫:

while True:
    try:
        n=input()
        print("hello, " + n)
    except:
        break

寫完之後拿到了一個AC (Accept, 表示通過的意思)。
大家也去試試解題的樂趣吧。
對平台操作有困難的邦友也歡迎在留言區發問哦~


1 則留言

2
dragonH
iT邦高手 1 級 ‧ 2019-07-16 09:15:32

推薦你 codewar

codewar 每個題目你可以選你要使用的語言來解題

幾乎常見的語言都有

就算該題目沒有你想使用的語言

只要是網站有支援的語言

你可以自己提交該語言的轉譯版本

也可以提交新的題目

解題需要通過

固定測試 跟 隨機測試

都通過才能提交

提交後就可以看到其他大神的寫法

站在巨人的肩膀學習是最有效率的/images/emoticon/emoticon07.gif


codewar 的 題目大概分為 8 個階級

8kyu ~ 1kyu (同空手道的分級)

數字越小難度越高


codewar 是採分級制度

每解完一題得到相對應的分數

分數會讓你的帳號升級

帳號等級不影響你解題的階級

你想直接衝 1kyu 也是可以的

帳號升級好像有其他功能吧

不過我是都沒在用


真要說 codewar 的缺點的話

就是他不支援 code intellisense

稍微有點不方便就是

與 leetcode 相比

codewar 的題目我覺得比較偏應用面相

天啊~ 太感謝您了~
剛剛試了一下這個網站的題目,
我覺得大概7,8級左右非常入門,
而1級左右的題目看起來也蠻有挑戰性的,
感覺能夠同時適合新手與大神練習的網站,
一般OJ上的題目難度大多只分「Easy」, 「Medium」,「Hard」。
其實大部分「Easy」對新手來說其實就偏難了。
很難得看到有OJ把等級制度做的這麼好~
解codewars題目簡直就像玩遊戲練等一樣,非常有趣。

查了一下,要可以自己出題的功能好像是要等級提升到夠高的樣子才能解鎖,同時也增進解題動力。
真的非常感謝您推薦這麼優質的練習平台~
小馬不勝感激哦~

dragonH iT邦高手 1 級‧ 2019-07-16 12:01:00 檢舉

codewar 真的是個不錯的練功網站

而且他的題目分級並不是誰說了算

而是大家解完題後來評級取平均的

不過這也有點小問題

有次寫了一個剛 submit 的 7yu

花了我好幾個小時

隨機測試還是過不了

這幾天回去看

好像被評到 3 kyu 了/images/emoticon/emoticon01.gif

哈哈~ 我覺得這個機制還蠻不錯的,
用多數人寫起來的感受來為題目評級~
長期來說,感覺蠻客觀的。
而且投票選最佳解答的制度,
讓答題解鎖之後看到的答案品質也不錯~

我要留言

立即登入留言