[程式設計] UVa 介紹,以及 UDebug 和其他輔助工具的介紹


The ACM-ICPC Live Archive

UVa 是一個線上解題系統 (online judge system),依維基百科的說法,它是西班牙瓦雅多利大學教授Miguel Ángel Revilla在1995年所創建的一個自動化線上的評測系統。



UVa 目前收錄了數千多道題目,大部分都需要一點演算法基礎才能解得出來。網站上提供了 C/C++,Java,Pascal 以及 Python 的評測環境。UVa 目前收錄了許多國際賽 ICPC 的題目。是個適合練功的好所在


練習解 UVa 的好處

就我來說,第一個是練習程式設計的能力囉。對於資工系的學生來說,學習語言、資料結構,或是演算法後,最怕的就是「我不知道要寫什麼呀?」

對於這點,UVa 倒是提供了一個解決方案,我們可以透過練習解題的方式來熟練學習過的知識。舉例來說,學過了 hashmap,但確不知道要用在什麼情況,或者說不知道如何使用 Java,或是 C++ 中的 hashmap,那就真的很冤了。這等於上了資料結構後,只學到了死的知識。

第二點,做為求職的依據。UVa 會記錄你的解題歷史,這部分的資料可以當成日後求職時,證明自己程式設計能力的佐證資料。這跟矽谷那兒很多工程師在刷 LeetCode 是同樣的意思。

在 UVa 的首頁中,選 My submissions, 或是 My statistics 都可以看到自己的解題記錄


第三點,練習分解問題。要能順利地解出 UVa 的題目,通常要做一些「大問題拆小問題」的工作。而大問題拆小問題的技巧,也正好是軟體工程師最難精通的技巧。

開發一個系統,最難的地方,就是穿透複雜的表相,將整個問題拆成一個一個可以解決的小元件,並讓每個元件可以互相溝通而不會彼此衝突。而這就是拆解問題的能力。這個能力很難學,得要透過大量的練習才能學會,解 UVa 的習題,就是練習最好的時機囉。

如何使用


使用上蠻簡單的,點選畫面右邊的 brows problems 就可以進入題目集中看題目。



畫面如下所示囉。

最前面如果是綠色的勾勾,代表這個題目只有唯一解,屬於一般型的題目。黃色的勾勾代表這題需要 special judge,有多種正確的解。紅色的勾勾我就不清楚了。網路上是說這種題目沒有I/O,無法解出(但我存疑就是了)

Total Submissions/ Solving % 代表總共有多少次上傳,這些上傳解出來的數量為何。這欄也可以代表難易度。基本上來說,通常百分比越大,代表越簡單。

Total Users/ Solving % 代表所有使用者中,解出這題的比例。這也可以做為難易度的代表。

瓢蟲則代表可以連到這題的 UDebug。UDebug 會再後面說明。


英文好難

解題就解題,還要看英文就讓人很鬱卒了。出演算法題目的人不知道為什麼,很愛包裝題目。他們通常會在開頭講一個故事,故事中包含了題目的說明。這都還好,最厲害的地方是,這個故事通常會寫得很長。看來出題的人通是很會講故事的爸爸或媽媽。

這種風格是好是壞就不評論了。但對於英文不好的同學來說,這堆敘述看完,火都熄了,想要練習的熱情也就隨風而去了。

我想一定有很多人有這樣的困擾,因此才有 Lucky 貓的出現囉 (下圖)。

不知道造福了多少程式設計初心者的 Lucky貓
Lucky 貓中包含了許多 UVa  題庫的翻譯,並且還貼心地分了難易度。依站長的說法,難易度是他自由心證的結果。我個人認為這個難易度的分類是蠻準的。

建議就從站長列的難度一題目解起囉。

測資都對,但就是無法 AC,那就使出 uDebug了

相信有在刷 online judge 系統的人都遇過這樣的問題,那就是範例測資都對,但送到系統後,怎麼樣都是WA (Wrong Answer) 的結果。這種情況常常是出在解題時,有些特殊的狀況沒有考慮到。

這個時候,可以靠 uDebug 來看看能不能突破困境了。

uDebug 裏有熱心的解題手提供他的測資,你可以使用這些測資來驗證自己的程式。常常就可以由這些測資中找到自己沒考量到的點,進而除出錯誤來。

在題目前面的「小蟲」上一點後,就可以連結到對應的 uDebug 頁面。左半邊是使用者所提供的範例測資。通常選 votes 數目較高的測資,比較有可能是可信度較高的測資囉。

選擇之後,右方的 Input 中就會出現範例測資了。


在下面的畫面中,點選「get accepted output」,即可得到對應的輸出。這是你把你程式的ouput,也放到右邊的「your input」窗格中。再把捲軸往下拉,即可看到「compare outputs」的按鈕。按下去後,系統就會比對你的輸出,和範例輸出的異同囉。如果有不同處,系統也會標出來,這時你就可以針對這些不同處,來檢視自己的解法了。







留言

這個網誌中的熱門文章

由 Pandas 的 DataFrame 中取得資料

[程式設計] C++ 的字串切割