# [A Survey on Online Judge Systems and Their Applications](https://dl.acm.org/doi/10.1145/3143560) > Szymon Wasik, Maciej Antczak, Jan Badura, Artur Laskowski, and Tomasz Sternal. 2018. A Survey on Online Judge Systems and Their Applications. ACM Comput. Surv. 51, 1, Article 3 (January 2019), 34 pages. https://doi.org/10.1145/3143560 ## 1. Introduction * **線上評測系統**(以下稱 Online Judge 或簡稱 OJ)一詞在 2001 首次被提出,意指在部份程式競賽中使用的一種線上的、全自動化的,可以檢驗參賽者所提交的程式碼/執行檔/文字檔正確性的系統。此處先簡單描述供讀者大致理解這個詞的意思,更嚴謹的定義請參考後文。 * 儘管詞源在 2001 年才出現, OJ 系統本身的存在歷史其實更為悠久,最早可以追溯到 1961 年,在 Stanford University 中開始被使用。1970 年,在 Texas A&M University 所舉辦的第一屆 ICPC 程式競賽中,線上評測系統被用來自動驗證參賽者提交的程式碼是否執行出正確答案,以及是否有使用超過限制的計算資源,並根據評估對參賽者進行 realtime 的排名。後來,IOI 參考了 ICPC 的作法,也使用了 OJ 進行評分,但是採用了不同的計分規則。 * 在設計一個 OJ 系統的時候,需要考慮到許多重要因素,包含: * **可靠度與安全性**:由於 OJ 系統需要執行由不特定使用者所上傳的程式碼,確保系統不會被使用者玩壞是一件很重要的事。近年來流行使用虛擬機或容器(如 Docker)等方式作為沙盒來隔絕實體機器與使用者程式碼的執行環境,這種作法可以顯著的提升系統的安全性和可靠度。 * **時間測量精準度**:由於程式競賽往往會需要評估使用者的程式碼所花費的時間,用來作為評分或排名的依據或是執行期間的限制,因此計時的精確度是相當重要的。關於這方面的研究可以參考 [Ilsche et al. (2015)](https://link.springer.com/chapter/10.1007/978-3-319-16012-2_6)。 * **執行環境一致性**:由於 OJ 系統在比賽快要結束時很容易會有 intense 的流量進入系統,為了保證每一次的評測都是在一致且可靠的環境下執行的,OJ 系統通常會被開發成 PaaS 形式的雲端計算服務,並且採用並行化 (concurrency) 與平行化處理 (parallel processing) 的技術來提升效能。關於 OJ 系統應用 [Symmetric Multiprocessing (SMP)](https://zh.wikipedia.org/zh-tw/%E5%AF%B9%E7%A7%B0%E5%A4%9A%E5%A4%84%E7%90%86) 環境的分析,可以參考 [Drung et al. (2011)](https://ieeexplore.ieee.org/document/6024016)。 * **題目與測資品質**:例如測資是否全面、可以測到各式各樣的狀況等。有某些類型的題目可以用 heuristic algorithm(像是退火法或基因演算法那些的)來解決,或是用不正確的方法求解卻依然得到不錯的分數,這些問題應該要被改善。此外,在教育情境下使用的題目應該要特別注意題目的敘述是否直觀好理解。 * 傳統來說在 OJ 上的問題集大多都可以被歸類為組合問題 (combinatorial problems),但近年來也有一些 OJ 系統專門被設計出來解決工業領域的問題。以 OJ 系統將問題外包給感興趣的工程師或科學家來解決,會比起業界自行聘請專家小組來解決更容易、也更快可以找到最佳解決方案,這樣的行為稱為「眾包 (crowdsourcing)」。關於經常被發佈在 OJ 系統上的問題類型可以分類如下: * **組合問題**:也就是給定一套約束條件 (constraint),要尋找在滿足該限制底下的一組離散變數的值。可以再進一步細分為 * 決策問題:檢查該問題是否存在滿足限制的答案 * 搜尋問題:找出一套滿足該限制的答案 * 最佳化問題:搜尋問題的特例,答案在滿足限制的前提下還需使特定函數值最大/最小化 * **工業問題**:實際與工業界合作,由業界提出實際上遇到的問題,並集結參賽者的力量來找到最佳解法。實際的例子有: * [ROADEF Challenge](https://challenge.roadef.org/): 法國運籌學會組織所舉辦的比賽,每兩年辦一次,由工業界提供題目,並配有實際問題的測資 * [International Planning Competition (ICP)](https://ipc2023.github.io/): 主要在解決作業研究問題或是規劃問題 * JILP Workshop on Computer Architecture Competitions: 主要在研究電腦硬體或基礎設施的參數最佳化的問題(好像沒在辦了?) * **資料科學問題**:由於近年來資料探勘的研究開始興盛,以資料科學問題為主的 OJ 網站數量開始成長,其中最知名的平台就是 [Kaggle](https://www.kaggle.com/),該平台舉行了數次競賽,並成功套過競賽集結了非常多的資料科學家共同解決問題。 * 本文的主要貢獻如下: 1. 由於過去文獻中沒有一個對 OJ 系統的正式定義,因此在本文中對線上評測系統提出了一個形式化的正式定義 2. 調查並根據功能分類了現有的線上評測系統 3. 總結這些系統中最常見的評測方法 4. 以 optil.io 作為示例,展示 OJ 平台的潛在應用 ## 2. Online Judge Systems 一般來說,一個線上評測系統指的是可以透過網際網路從世界各地存取,並且可以在雲端針對使用者所提交的演算法提供安全、可靠、持續性的評估。一個可以執行全部或部份評估流程的系統,都在本文中被歸類為一個線上評測系統。其中,「評估流程」的定義如下: :::success **Definition 2.1 (Evaluation Procedure)** An evaluation procedure consists of three steps: 1. submission 2. assessment 3. scoring ::: 詳細的評估流程可以由以下流程圖描述: ![flow1.png](https://hackmd.io/_uploads/H1DdQG_X6.png =50%x50%) > Figure 1. 評估流程的流程圖 而一個正式的線上評測系統的定義,將在 Definition 3.6 中給定。 ### 2.1 Methods * 過去已經有一些文獻在「分類 OJ 系統」上做了探討,但過去的文獻大多都只專注於單一應用領域,例如程式競賽或是教育用途,還沒有任何一篇文獻根據「OJ 系統的潛在應用」來進行探索與分類。這種分類方式可能會對正在尋找 OJ 系統來滿足其需求的讀者相當有幫助,因此本文選擇了以這樣的準則進行分類。 * 本文是一篇 survey paper,因此研究方法主要為從網路上蒐集文獻並閱讀分析。關於本文研究方法相關的敘述有以下: * 搜尋的文獻來源 * Web of Science * Google Scholar * Scopus Indexes * Olympiads in Informatics journal * 如果沒有發表論文就直接搜他們官網 * 搜尋的關鍵字 * online judge * online judge systems * automated programs grading * automated grading programming * 遵循撰寫 review paper 的 guideline ([Keele University (2007)](https://www.elsevier.com/__data/promis_misc/525444systematicreviewsguide.pdf); [Kitchenham et al. (2009)](https://www.sciencedirect.com/science/article/abs/pii/S0950584908001390?via%3Dihub)),定義了以下標準來判斷一個系統是否被納入本文當中 * 系統是否可以支援上述評估階段的任一子集合 * 系統是否可以評估那些用來解決組合問題的演算法 * 系統是否有英文版,或是描述該系統的論文是用英文寫的 * 系統是否可以公開存取(是免費的) * 系統是否可以正常運作(到 2017 年 1 月為止還可以或曾經提供註冊及上傳程式碼已解決至少一個問題的功能) * 基於以上方法與準則羅列了現有的線上評測系統後,作者將系統分類成以下六大類別分別進行討論(按照該分類中的系統數量降序排列): * 用於舉辦或練習程式競賽 * 用於教育目的 * 線上編譯器/執行環境 * 用於招聘員工 * 用於解決資料科學問題 * 線上評測系統的基礎建設 * 所有被收錄在本文中的系統,作者都提供了一些相關的重要資訊,並列表在表 1 到 6 當中,這些資訊包含: * 是否開源 * 該網站的語言(英文/中文/法文...) * 支援的編譯器的數量(見下文) * 發佈的問題集數量 * 註冊使用者數量 * 創建年份 * 是否還有在維護 * 由於許多平台支援的編譯器數量會快速變化(新的語言出來就會加上新的編譯器),所以在「支援的編譯器的數量」此一分項上並不是直接列出實際數量,而是將系統分為四個級別: * Class 0:不支援任何編譯器的系統,只評估演算法執行結果 * Class 1:只支援一種語言的系統 * Class 2:支援一些最泛用的語言的系統,如 C++、Java、Python 和 C# 等 * Class 3:支援廣泛範圍的編譯器的系統 ### 2.2 Competitive Programming | Active <br> (2023/11) | Name and URL Address | OSS | GUI Language | Compilers Class id | #Problems | #Users | Established | |-|-|-|-|-|-|-|-| | **No** | A2 Online Judge | No | Eng | 3 | 300 | 55000 | 2011 | | Yes | [AC 2333](https://ac.2333.moe/) | No | Chi | 2 | 670 | 3300 | 2011 | | **No** | AcDream | No | Eng,Chi | 2 | 300 | 5200 | 2013 | | **No** | ACM-ICPC live archive | No | Eng | 3 | 1000 | 52000 | 2003 | | Yes | [ACM-Kyrgyzstan Subregion](https://olymp.krsu.edu.kg/GeneralProblemset.aspx) | No | Eng | 3 | 422 | 3600 | 2005 | | **No** | Adjule Online Judge | No | Pol | 2 | 120 | 3000 | 2011 | | Yes | [Aizu Online Judge](https://judge.u-aizu.ac.jp/onlinejudge/) | No | Eng,Jpn | 3 | 1000 | 36000 | 2004 | | Yes | [Al Zimmermann’s Programming Contests](http://azspcs.com/) | No | Eng | 0 | 26 | 2000 | 2009 | | **No** | BNU OJ | Yes | Eng,Chi | 3 | 51000 | 31000 | 2013 | | **No** | Carribean Online Judge | No | Eng,Spa | 3 | 2700 | 28000 | 2010 | | Yes | [CDOJ](https://acm.uestc.edu.cn/) | Yes | Eng,Chi | 2 | 1300 | 9600 | 2014 | | Yes | [Codeforces](https://codeforces.com/) | No | Eng,Rus | 3 | 3000 | 32500 | 2010 | | Yes | [Don Mills Online Judge](https://dmoj.ca/problems/) | Yes | Eng | 3 | 700 | 7700 | 2014 | | Yes | [e-olymp](https://www.eolymp.com/en/) | No | Eng | 3 | 7500 | 47000 | 2006 | | **No** | EI Judge | No | Eng,Rus | 3 | 400 | 20000 | 2003 | | Yes | [Facebook Hacker Cup](https://www.facebook.com/hackercup) | No | Eng | 0 | N/A | 80000 | 2011 | | **No** | Fuzhou University Online Judge | No | Eng,Chi | 2 | 1300 | 34000 | 2008 | | **2023** | Google Code Jam | No | Eng | 0 | 450 | 200000 | 2008 | | 2011 | [Herbert Online Judge](http://herbert.tealang.info/problems.php) | No | Eng,Chi | 1 | 1761 | 1200 | 2010 | | **No** | HIT ACM/ICPC | No | Eng | 2 | 1300 | 54000 | 1998 | | Yes | [HUSTOJ](http://www.hustoj.org/) | Yes | Eng,Chi | 2 | 650 | 26000 | 2014 | | Yes | [Indian Computing Olympiad Problems Archive](https://www.codechef.com/IARCSJUD) | No | Eng | 2 | 45 | 1250 | 2003 | | Yes | [Internet Problem Solving Contest](https://ipsc.ksp.sk/) | No | Eng | 0 | 240 | 5000 | 1999 | | Yes | [Light OJ](https://lightoj.com/) | No | Eng | 2 | 430 | 14000 | 2012 | | **No** | LYDSY | No | Chi | 2 | 1000 | 30000 | 2008 | | **No** | Main | No | Eng,Pol | 1 | 1000 | 33000 | 2005 | | **No** | National Taiwan University Online Judge | No | Chi | 2 | 2600 | 600 | 2016 | | Yes | [National Tsing Hua University Online Judge](https://acm.cs.nthu.edu.tw/) | No | Eng | 1 | 10000 | - | 2015 | | **No** | North University of China Online Judge | No | Eng | 1 | 2000 | 4000 | 2006 | | Yes | [P3G](https://wcipeg.com/main) | No | Eng | 3 | 1100 | 500 | 2008 | | Yes | [Peking University Judge Online](http://poj.org/) | No | Eng | 2 | 3000 | 250000 | 2003 | | Yes | [Petrozavodsk State University](https://acm.petrsu.ru/site/) | No | Eng,Rus | 2 | 450 | 140 | 2010 | | Yes | [Project Euler](https://projecteuler.net/) | No | Eng | 0 | 550 | 650000 | 2001 | | Yes | [SPOJ](https://www.spoj.com/) | No | Eng | 3 | 6000 | 60000 | 2004 | | Yes | [SPOJ PL](https://pl.spoj.com/) | No | Pol | 3 | 800 | 36000 | 2004 | | Yes | [Szkopuł](https://szkopul.edu.pl/) | Yes | Pol | 1 | 1000 | - | 2012 | | Yes | [Teddy Online Judge](https://www.teddyonlinejudge.net/) | Yes | Spa | 3 | 250 | 1900 | 2009 | | Yes | [Timus Online Judge](https://acm.timus.ru/) | No | Eng | 3 | 1000 | 110000 | 2000 | | **No** | TJU ACM-ICPC Online Judge | No | Eng,Chi | 2 | 3000 | 52000 | 2005 | | Yes | [TopCoder Competitive Programming](https://www.topcoder.com/talent/compete/) | No | Eng | 2 | 5200 | 4000 | 2001 | | Yes | [USA Computing Olympiad](http://usaco.org/) | No | Eng | 2 | 150 | 12000 | 2013 | | Yes | [UVa Online Judge](https://onlinejudge.org/) | No | Eng | 2 | 5000 | 250000 | 1995 | * 佔所有的 OJ 平台中最大宗的一種應用,因為許多大學會提供這種系統來幫助學生練習,以準備參加競賽。 * 第一個引起高度關注的是 **Uva OJ**,至今都還是很受歡迎,上面的題目很多而且難度範圍很廣,並且測資很完善。(作者甚至還出書) * 一些被廣泛使用的系統有: * **清大 OJ**:有一萬多道題目,類似 ACM ICPC 的 OJ * **Codeforces**:來自俄羅斯的網站,比賽的時候會分組,同組的參賽者在比賽結束後可以看別人提交的程式碼並抓錯,有抓到的話會有獎勵,被抓到會有懲罰 * **SPOJ**:題型很豐富,包含最佳化問題、code-golf 或 riddles 都有 * **E-Olymp**:來自烏克蘭的網站,支援世界各地負責訓練競程選手的國家機構 * **TopCoder**:歷史悠久的網站,已經舉辦過上千次的比賽,比賽採回合制(?),每回合 75 分鐘並有三題要解,依照花費時間的倒數比例得分 * 也有一些由各個大學自行維護,並不那麼多人用的系統,像是: * 天津大學 OJ(中國) * 北京大學 OJ(中國)(這很多人用吧?!) * Timus OJ(俄羅斯) * EI Judge(俄羅斯) * AC 2333(中國) * Adjule OJ(波蘭) * (還有幾間大學自己的 OJ 都在上面了懶得列) * 有一些系統是由舉辦比賽的主辦單位自己維護推廣的,他們通常會保存過去比賽的題目,讓新的使用者可以練習。這些系統包含: * **USACO**:美國資奧的網站,上面除了有題目還有教學文件。每年會舉辦五到六場比賽 * **Aizu OJ**:日本資奧的網站,存有日本資奧和高中資訊能力競賽的題目存檔 * ACM-ICPC Live Archive:從 1988 年開始在世界各地舉辦的 ICPC 比賽的題目存檔(網站掛了) * MAIN:波蘭資奧的網站,Szkopuł 是他的配套網站,可以使用 MAIN 的題目在上面舉辦虛擬比賽(網站掛了) * 也有一些較小的系統如 ACM Kyrgyzstan Subregion Challenges Archive、Indian Programming Olympiad Archive、A2 Online Judge、AcDream 和 Light OJ * 前述的系統大多是專有軟體,但網路上也有一些開源的 OJ 平台,像是: * HUSTOJ * CDOJ(只能在電子科技大學的校網內存取) * Teddy OJ * DMOJ:這個網站的開發文件很完整,可以在 Github 上面找到。網站上蒐集了來自加拿大資訊競賽、加拿大資奧、克羅埃西亞資訊競賽、IOI 等比賽的題目 * 還有一些不那麼傳統的 ~~(aka 不知道該分進什麼類的)~~ OJ,例如: * Project Euler:每個禮拜都會上一個新的題目,題目大多是數學問題,可以透過寫程式來求解 * Al Zimmermann's Programming Contests:專注在運算密集的問題,不用上傳程式碼,只要上傳解法的報告就可以 * IPSC:有各式各樣的題目可以寫,像是 ACM、搶旗、最佳化問題等 * Herbert Online Judge(註:雖然網站還進得去,但是題目要用 Flash 才看得到,所以基本上跟死了沒兩樣(。) * Google 和 Facebook 兩家科技龍頭自己辦的程式競賽(但是一個倒了,一個比賽結束後也看不到題目) * 因為網路上這種練競程的網站真的太多了,有些人會想要嘗試對這所有的題目進行索引和分類: * [Zhu and Fu (2012)](https://link.springer.com/chapter/10.1007/978-3-642-30126-1_106):提了一個作法,但沒有實作他們的系統出來 * [uHunt](https://uhunt.onlinejudge.org/):UVA 專用的題目索引網站,好像是手動維護的 * [BNUOJ](https://github.com/51isoft/bnuoj):目前已經掛了,但之前好像可以從這個網站往其他 24 個網站送出提交。其開源程式碼在 Github 上面可以找到 ### 2.3 Education | Active | Name and URL Address | OSS | GUI Language | Compilers Class id | #Problems | #Users | Established | |-|-|-|-|-|-|-|-| | Yes | [CheckiO](https://checkio.org/) | No | Eng | 1 | 100 | 110000 | 2013 | | **Yes** | [Code Fights](https://codefight.in/index.php) | No | Eng | 3 | 1250 | 500000 | 2015 | | Yes | [Codeboard](https://codeboard.io/) | Yes | Eng | 3 | 24000 | 60000 | 2015 | | Yes | [Codecademy](https://www.codecademy.com/) | No | Eng | 3 | N/A | 25000000 | 2011 | | Yes | [CodeChef](https://www.codechef.com/) | No | Eng | 3 | 1500 | 300000 | 2009 | | Yes | [CodeHunt](https://www.microsoft.com/en-us/research/project/code-hunt/) | No | Eng | 1 | 134 | 350000 | 2014 | | Yes | [Codewars](https://www.codewars.com/) | No | Eng | 3 | 1200 | 400000 | 2012 | | Yes | [CodinGame](https://www.codingame.com/start/) | No | Eng | 3 | 55 | 500000 | 2012 | | Yes | [CodingBat](https://codingbat.com/java) | No | Eng | 2 | 300 | - | 2009 | | **Yes** | [Embedded Security CTF](https://www.n-coe.in/event/embedded-security/) | No | Eng | 1 | 19 | 35000 | 2014 | | Yes | [Exercism](https://exercism.org/) | Yes | Eng | 3 | 1450 | 30000 | 2013 | | Yes | [Jutge.org](https://jutge.org/) | No | Eng,Spa,Cat,Ger,Fre | 3 | 2000 | 14000 | 2006 | | Yes | [Leek Wars](https://leekwars.com/) | No | Eng,Fre | 1 | 1 | 54000 | 2013 | | **No** | Programming Grid | No | Chi | 2 | 640 | - | 2008 | | Yes | [Python Challenge](http://www.pythonchallenge.com/) | No | Eng | 0 | 33 | N/A | 2005 | | 2015 | [RACSO](https://racso.lsi.upc.edu/juezwsgi/index) | No | Eng,Spa,Cat | 0 | 330 | - | 2012 | | **No** | The AI Games | No | Eng | 3 | 8 | 2700 | 2013 | | **Yes** | [URI Online Judge](https://www.beecrowd.com.br/judge/en/login?redirect=%2Flogin%3Forigem%3D1) | No | Eng,Spa,Por | 2 | 1170 | 4100 | 2011 | * OJ 最早就是從應用於教育場域開始的,最早的紀錄是 1961 年在 Stanford University 的課程中,用來批改學生的 ALGOL 程式。這個概念隨後引發了更多的系統,但這些系統已經全都掛了,不斷演變的最後變成了在 MOOC (Massive Open Online Course) 上實作 OJ 系統的形式。 * MOOC 可以分成 xMOOC(教材預錄,完全由使用者自學)和 cMOOC(有教學機構參與安排課程)兩種。前者的 OJ 通常會比較像上一個分類那樣,全自動給使用者的程式碼做評分;後者則可能還會有教師批改學生的程式碼,例如加上註解給予修改建議等等。 * 一些著名的 MOOC 系統有: * [edX](https://www.edx.org/): 由 MIT 和 Harvard 合辦的非營利組織 * [Coursera](https://www.coursera.org/): 從 Stanford 源起的,課程非常多元,現在也與許多大學合作 * [Udacity](https://www.udacity.com/): 也是從 Stanford 源起的,主要 focus 在資訊工程領域的課程 * 在教育場域中使用 OJ 有以下幾個好處: * 教師可以更準確地驗證學生提交的程式碼是否正確,尤其在測資全面(所有邊際條件都有考慮到)時,沒抓到學生程式碼的邏輯錯誤基本上是不太可能的 * 由於自動批改的速度很快,教師有更多時間可以準備更多題目給學生練習 * 學生可以很快速的得知自己的程式碼哪裡錯誤 * **過去針對 OJ 應用在教育場域的相關研究有以下這些**: * [Cheang et al. (2003)](https://www.sciencedirect.com/science/article/abs/pii/S0360131503000307?via%3Dihub): 描述了 OJ 系統在新加坡大學的演算法與資料結構還有競技程式設計等課程中的成功應用 * [Ala-Mutka (2005)](https://www.tandfonline.com/doi/abs/10.1080/08993400500150747): 深入評論了 OJ 系統在教育場域中的應用,並針對幾個系統做出了分析 * [Ihantola et al. (2010)](https://dl.acm.org/doi/10.1145/1930464.1930480): 針對 OJ 系統在自動化程式練習上提出了更近期的回顧,並且分析了這些系統的功能還有在不同情境下的使用方式,從教育角度來看十分有趣 * [Fonte et al. (2013)](https://drops.dagstuhl.de/opus/volltexte/2013/4034/): 描述了如何擴展傳統的 OJ 系統以提供在語意層面上對學生更有幫助的回饋,以及更有意義的建議,幫助學生發現他們的問題所在。而稍後 [Wang et al. (2016)](https://sciendo.com/article/10.1515/fcds-2016-0004) 的研究也證實這樣的作法對於學生的學習過程有非常顯著的幫助 * [Ivanova (2016)](https://dl.acm.org/doi/10.1145/1163405.1163407): 提出了以遊戲式學習包裝或整合 OJ 系統的作法,以期吸引更多使用者 * 由於那些蒐集了程式競賽題目的 OJ 系統近年來變得相當流行,因此也出現了基於這些系統改編而成的,專門用於教育目的的版本。例如: * **URI Online Judge**: 上頭的題目被分類成八個類別,可以讓使用者容易地找到對應主題的練習。也有提供教師用面板,讓教師可以追蹤學生的學習過程(功能確實豐富,但 UI 相當混亂) * **CodeChef**: 支援 40 多種不同的語言,並且課程有經過模組化,不過就算是最簡單的題目都還是有點難(UI 蠻漂亮的) * **Jutge.org**: 題目比前者簡單,支援 20 多種不同的語言,也有提供教師面板可以觀察進度(但 UI 有點陽春) * Programming Grid(掛了) * 有些 OJ 系統融入了遊戲元素,以增強使用者的參與感和學習動力。例如: * **CheckiO**: 提供大量相對簡單的任務,協助使用者學習 Python 和 JavaScript。課程有經過模組化,頁面上有進度條可以觀察關卡進度,並且也有教師用面板。這個網站還附有一個大型多人戰略遊戲,讓玩家可以透過解題蒐集遊戲內的道具,並且還要自己撰寫 bot 來進行攻擊和防禦 * **Codewars**: (跟 CKJ 好像!)按難度和主題分類提供了大量的練習題,並且會提供幾個基本的測資(他連測資怎麼測的那個程式碼都寫給你看)。開發者好像是很喜歡日本文化的歐美人( * **CodeHunt**: Microsoft 開發的遊戲,目的在於增強使用者的程式撰寫能力,以 C# 和 Java 的題目為主 * **PythonChallenge**: (哇靠有夠好玩)一個像密室逃脫的遊戲,每一關都是一個網頁,裏面會有一些謎題,都可以用簡單的 Python 程式碼求解,答案會是通往下一關的網址。但需要有一些 Web 知識才能順利操作 * 在遊戲化元素的分類裏面,有一群網站是的特色是由使用者撰寫 AI,跟系統或其他使用者提供的 AI 進行攻防,以提升玩家的等級這類的多人競技遊戲。例如: * **CodinGame**: 題型非常多,除了 AI 比賽之外,也有程式解謎、最佳化問題和 code-golf 等其他類型的題目 * **Leek Wars**: 每個人的角色都是一根韭蔥 (leek) * **Code Fights**: 類似前者 * **AI Games**: (網站掛了)平台提供了八種知名的遊戲(像是 OOXX 或是圍棋之類的),讓使用者可以撰寫這些遊戲的 AI 來比賽 * 還有一些平台著重於教學,而非解題: * **Codecademy**: 有提供完整的教學內容以及程式碼練習給使用者 * **CodingBat**: 很陽春的解題平台,有教學影片可以看,只支援 Java 和 Python * **Exercism.io**: 整體 UI/UX 非常良好,支援非常多種語言,習題有依照難度分類,解題側版居然還有 ChatGPT 可以問(需要抖內解鎖) * **Codeboard**: UI 是一個 IDE,有提供教師自訂題目並和學生分享的功能,可以輕易的追蹤學生的學習進度 * 其他雜七雜八的: * **Embedded Security CTF**: 以資安題目為主,平台提供的工具非常先進 * **RACSO**: 練習計算理論題目的網站(超酷) ### 2.4 Online Compilers | Active | Name and URL Address | OSS | GUI Language | Compilers Class id | Established | |-|-|-|-|-|-| | Yes | [C++ Shell](https://cpp.sh/) | No | Eng | 1 | 2014 | | Yes | [Codeanywhere](https://codeanywhere.com/) | No | Eng | 3 | 2013 | | Yes | [Codepad](http://codepad.org/) | No | Eng | 3 | 2008 | | Yes | [CodeSkulptor](https://py2.codeskulptor.org/) | Yes | Eng | 1 | 2012 | | Yes | [Coding Ground](https://www.tutorialspoint.com/codingground.htm) | No | Eng | 3 | 2006 | | Yes | [Codio](https://www.codio.com/) | No | Eng | 3 | 2013 | | Yes | [Ideone](https://ideone.com/) | No | Eng | 3 | 2009 | | 2013 | Online Compiler | No | Eng | 2 | 2009 | | **No** | Web Compiler | No | Eng | 1 | 2014 | * 在本文中,線上編譯器也被歸類為一種廣義上的線上評測系統。但他通常不提供任何解題的服務,只能執行評估階段的第一個步驟(執行程式碼)。 * 一些功能豐富的線上 IDE 有: * **Codeanywhere**: 允許使用者共享專用的虛擬環境,具有即時協作功能,可以自動連接到 Github, Bitbucket, FTP server 和 Amazon cloud 等其他雲端服務 * **Coding Ground**: 讓使用者可以在雲端環境下編輯、編譯、執行和分享他們的專案,支援許多語言,每個使用者的程式都被執行在 Docker 當中 * **Codio**: 同樣支援許多語言,並且提供遠端的 ubuntu 開發機器、可以跟 e-learning 平台整合,甚至有抄襲偵測功能 * 另一些功能比較陽春的線上編輯器則是只有編譯和執行程式碼的功能,例如: * Ideone * CodeSkulptor * C++ Shell * Codepad * Online Compiler(掛了) * Web Compiler(掛了) ### 2.5 Recruitment | Active | Name and URL Address | OSS | GUI Language | Compilers Class id | #Problems | #Users | Established | |-|-|-|-|-|-|-|-| | Yes | [CodeEval](https://www.hirevue.com/platform/assessment-software) | No | Eng | 3 | 240 | 85000 | 2009 | | Yes | [Codility](https://www.codility.com/) | No | Eng | 3 | 3000 | - | 2009 | | Yes | [HackerEarth](https://www.hackerearth.com/) | No | Eng | 3 | 3700 | 1000 | 2012 | | Yes | [HackerRank](https://www.hackerrank.com/) | No | Eng | 3 | 1000 | 84000 | 2009 | | Yes | [LeetCode Online Judge](https://leetcode.com/) | No | Eng | 3 | 190 | - | 2010 | | Yes | [Qualified](https://www.qualified.io/) | No | Eng | 3 | 4500 | - | 2015 | * 還有一些平台專門用在企業的員工招聘過程(例如:程式面試),例如: * **CodeEval**: (改名字了)算是一個開發人員的社群,社群中的開發者可以互相競爭,並且建立起自己的個人檔案,以展示他們的程式能力 * **Codility**: 由企業建立題組,釋出給參與面試的應徵者,讓他們可以在任何方便的時間參加程式面試。此外,也有提供解題練習的服務,讓應徵者可以先磨練自己的程式技能。可惜好像要付費才能使用 * **Qualified**: 類似前者,一樣要付費才可以用 * **HackerEarth**: (練習部份的網頁 404 了:()提供招募員工和舉辦黑客松等功能 * **HackerRank**: 類似前者 * **LeetCode**: 這大家應該都很熟吧 :D ### 2.6 Data-Mining Services | Active | Name and URL Address | OSS | GUI Language | Compilers Class id | #Problems | #Users | Established | |-|-|-|-|-|-|-|-| | Yes | [CrowdANALYTIX](https://www.crowdanalytix.com/) | No | Eng | 0 | 105 | 16000 | 2012 | | Yes | [DREAM Challenges](https://dreamchallenges.org/) | No | Eng | 0 | 45 | 5000 | 2006 | | Yes | [Kaggle](https://www.kaggle.com/) | No | Eng | 0 | 220 | 550000 | 2010 | | 2017 | MLcomp | No | Eng | 1 | 12400 | 7000 | 2010 | | Yes | [OpenML](https://www.openml.org/) | Yes| Eng | 3 | 19600 | 2500 | 2016 | | Yes | [Optil.io](https://www.optil.io/optilion/) | No | Eng | 3 | 11 | 300 | 2016 | | Yes | [TopCoder Data Science](https://www.topcoder.com/customer/data-science/) | No | Eng | 2 | 400 | - | 2001 | | 2015 | TunedIT | No | Eng,Pol | 3 | 36 | 10000 | 2008 | * 近年來也有許多 OJ 被用來解決資料探勘相關的問題。 * 以舉辦比賽為主的平台有: * **Kaggle**: 這個分類的元老級網站,透過發佈資料集並舉辦比賽的方式解決了許多業界的資料科學問題。使用者只需要提交成果報告,不需要提交程式碼。網站上有許多資料集可以下載來使用,也有提供線上的 Jupyter Notebook 可以測試程式碼 * **CrowdANALYTIX**: 類似前者 * **DREAM Challenges**: 類似前者,但是主要專注在生醫方面的問題,並且參加者大多是科學家或研究人員,而非工程師 * **TopCoder Data Science**: TopCoder 的資料科學分部,主要專注於工業問題,但是可以使用的程式語言只有 C++, C#, Java * **Optil.io**: 作者自己開發的平台,主要專注在最佳化問題 * TunedIT(掛了) * 有一些網站只負責發佈資料集,沒有辦比賽: * **OpenML**: 蒐集了許多資料集,使用者可以使用這些資料集進行分析,並上傳自己的解決方法,這些解決方法也會被存到該網站的資料庫中 * MLcomp(掛了) ### 2.7 Development Platforms | Active | Name and URL Address | OSS | GUI Language | Compilers Class id | Established | |-|-|-|-|-|-| | Yes | [A+](https://github.com/apluslms/a-plus) | Yes | Eng | 1 | 2017 | | 2009 | [BOSS](https://sourceforge.net/projects/cobalt/) | Yes | Eng | 3 | 2012 | | Yes | [CloudCoder](https://cloudcoder.org/) | Yes | Eng | 2 | 2012 | | Yes | [Code Runner for Moodle](https://github.com/trampgeek/moodle-qtype_coderunner) | Yes | Eng | 3 | 2016 | | Yes | [DOMjudge](https://www.domjudge.org/) | Yes | Eng | 3 | 2004 | | 2015 | [Mooshak](https://mooshak.dcc.fc.up.pt/) | Yes | Eng | 2 | 2005 | | 2015 | [Online Judge Plugin for Moodle](https://github.com/hit-moodle/moodle-local_onlinejudge) | Yes | Eng,Chi,Por,Pol | 3 | 2012 | | Yes | [SIO2](https://github.com/sio2project) | Yes | Eng,Pol | 2 | 2012 | | Yes | [TestMyCode](https://testmycode.github.io/) | Yes | Eng | 1 | 2013 | | Yes | [Tsinghua Online Judge](https://dsa.cs.tsinghua.edu.cn/oj/) | No | Eng,Chi | 2 | 2012 | | 2015 | [Virtual programming lab](https://moodle.org/plugins/mod_vpl) | Yes | Eng | 3 | 2012 | | Yes | [Web-CAT](https://web-cat.org/home) | Yes | Eng | 3 | 2003 | | 2008 | xLx | No | Eng | 1 | 2001 | * 許多機構都會希望可以自己主辦或是管理自己的線上評測系統,此時如果有現成的 OJ 系統可以直接安裝,會有很大的幫助。 * (上表提供的大多是 OJ 系統的專案原始碼,系統本身需要自己架起來才看得到內容,因此此處不深入探討) ## 3. Evaluation Methodology 一個線上評測系統最重要的部份當然就是他的評測引擎。以下將詳細介紹及定義一個評測引擎的各個執行步驟。 ### 3.1 Combinatorial Problems * (以形式化的方式定義了組合問題,與下文無太大相關性,因此省略) ### 3.2 Assessment * 在評估過程中,評測這個階段是計算成本最高的,因為使用者所上傳的解決方案必須針對每一筆測資都驗證其正確性。 :::success **Definition 3.3 (Test Instance)** Let $\Sigma$ denote an alphabet used to encode both input and output data. Test instance $t_i \in T$ , where $T$ is a set of all considered for the particular problem test instances, is defined as a triple $t_i = (d_i, o_i, p_i)$, where $d_i = \Sigma^*$ is an input data, $o_i = \Sigma^*$ is a reference output data, and $p_i$ is a set of parameters passed to the evaluation engine. ::: * 關於測資: * 在大多數問題中,測資的輸入與輸出內容(即 $\Sigma$)通常會使用 ASCII 可以編碼的數字、空白、換行,以及英文字母等組成,並且一個測資會寫成一個單獨的檔案,因為這樣餵測資和驗證的動作會比較容易(相當於是在做字串比對而已) * 如果問題是有標準答案的,那麼 $o_i$ 可以事先算好存起來,這樣之後使用者一上傳程式碼就可以馬上做驗證。但有時候 $o_i$ 也可以是空的(沒答案的時候) * $p_i$ 代表特定的資源限制,像是記憶體限制、CPU 使用量、執行時間限制等等。如有特殊需要也可以傳遞別的參數,像是有用到隨機亂數的題目時,可以傳遞亂數的種子。若沒有特殊限制,$p_i$ 也可以是空的 :::success **Definition 3.4 (Solution)** A solution is a function, $b(d_i, p^{'}_i) → o^{'}_i$ , representing the binary form of the submission that, based on the input data $d_i$, computes output data $o^{'}_i$, taking into consideration execution parameters $p^{'}_i$ provided by the evaluation engine. ::: * 關於使用者上傳的解決方案: * 使用者收到的系統參數集可以和實際上評測時所使用的系統參數集相同,又或是正式參數的子集合。==通常 $p^{'}_i$ 會是空的,因為系統執行時會使用哪些參數通常不會讓使用者知道==(??通常會知道吧) :::success **Definition 3.5 (Evaluation Engine)** An evaluation engine is a function, $E(b,t_i) \rightarrow (s_i, v_i, e_i)$, that executes the binary file $b$, giving it as an input the test instance $t_i$ , and returning the execution status $s_i$, an evaluation score calculated for the solution output, $v_i \in R$, and the list of statistics collected for the execution process $e_i$. ::: * 關於評測引擎: * 輸出的狀態 $s_i$ 通常在提交答案後不用多久使用者就可以看到,其值有可能是以下這些: * **ACC**: 可以正常執行、沒有超過資源限制、輸出結果和標準答案一致 * **TLE**: 執行時間超過限制 * **MLE**: 使用的記憶體超過限制 * **WA**: 產生了未知格式或是錯誤的輸出內容。在此狀態下有時候還會收到一些說明解釋為什麼會錯,但這不是常見的作法 * **RE**: 執行時期發生了錯誤 * **OLE**: 輸出的資料超過大小限制(?) * (啊怎麼沒有 CE) * 評分的規則有很多種: * 若採用 ICPC 的規則,結果就只有通過/不通過兩種,所以 $v_i$ 是 0(因為沒用到) * 若採用 IOI 的規則,則 $v_i$ 就是使用者在不同測資上拿到 ACC 時可以得到的分數 * 有些系統採用更複雜的規則計分,例如考慮程式碼執行的時間,對跑太久的正確答案還是會進行一些扣分 * $e_i$ 則是會蒐集程式碼執行期間產生的一些統計資料,例如:最久的測資跑了多久、用了多少記憶體等,這些資料不一定會回報給使用者(ZeroJudge 有) ### 3.3 Scoring * (以形式化的方式定義了在有 ACC 的情況下使用者可以得到的分數) ### 3.4 Online Judge * 綜合以上的定義,本文對於一個 OJ 系統給出了一個完整的形式化定義: :::success **Definition 3.6 (Online Judge System)** An online judge system is an online service that performs any of the steps of the evaluation procedure in a cloud; that is: (1) collects, compiles sources if needed, and verifies executability of resultant binaries; (2) assesses solutions $b(d_i,p^{'}_i)$ based on a set of test instances, $T$, defined for a particular combinatorial problem $\Pi$ in a reliable, homogeneous evaluation environment; (3) computes the aggregated status s and evaluation score $v$ based on the statuses and scores for particular instances (i.e., $s_i$ and $v_i$ , where $1 \leq i \leq |T |$). ::: ## 4. Example Application based on optil.io Platform 作者打廣告時間,省略。 ## 5. Conclusion 總結此篇論文,省略。 ## Future Work * The area of students’ assignments assessment has been quite extensively explored in many well-known review papers where such systems are described in the light of potential applications, such as teaching use cases (Caiza and del Álamo Ramiro 2013; Ihantola et al. 2010, 2015; Romli et al. 2010; Staubitz et al. 2015; Wilcox 2016). * 可以看看的文獻們 * [ ] [Programming assignments automatic grading: review of tools and implementations](https://library.iated.org/view/CAIZA2013PRO) * [ ] [Review of recent systems for automatic assessment of programming assignments](https://dl.acm.org/doi/10.1145/1930464.1930480) * [ ] [Educational Data Mining and Learning Analytics in Programming: Literature Review and Case Studies](https://dl.acm.org/doi/10.1145/2858796.2858798) * [ ] [Automatic programming assessment and test data generation a review on its approaches](https://ieeexplore.ieee.org/document/5561488) * [ ] [Towards practical programming exercises and automated assessment in Massive Open Online Courses](https://ieeexplore.ieee.org/document/7386010) * [ ] [Testing Strategies for the Automated Grading of Student Programs](https://dl.acm.org/doi/10.1145/2839509.2844616) * Zhu and Fu (2012) introduced a system for automatic classification of challenges based on hierarchical knowledge representation (Yoon et al. 2006). Unfortunately, their system has not been put into practice. * 有可能可以實作? * [ ] [Moodle Plugins for Highly Efficient Programming Courses](https://research.moodle.org/51/1/20%20-%20Zhigang%20-%20Moodle%20Plugins%20for%20Highly%20Efficient%20Programming%20Courses.pdf) * Ala-Mutka presented an in-depth review of applications of online judges in education based on the analysis of several systems (Ala-Mutka 2005). In 2010, Ihantola et al. prepared a more recent review of available software dedicated to automatic assignment of programming exercises, focusing on detailed descriptions of their features and various usage scenarios, which is interesting from a pedagogical or educational point of view (Ihantola et al. 2010). * [x] [~~A Survey of Automated Assessment Approaches for Programming Assignments~~](https://www.tandfonline.com/doi/abs/10.1080/08993400500150747) * In turn, Cruz et al. presented how to extend the typical online judge architecture to develop a system that goes a step further by providing valuable feedback to users at a semantic level in the form of meaningful advice to understand where the problem is and how to improve the code (Fonte et al. 2013). * [x] [~~A Flexible Dynamic System for Automatic Grading of Programming Exercises~~](https://drops.dagstuhl.de/entities/document/10.4230/OASIcs.SLATE.2013.129) * Finally, there is an interesting idea of building computer games that integrate or wrap online judge systems to be more attractive to users (Ivanova 2016) * 跟遊戲式學習有關的主題 * [ ] The International Scientific Conference eLearning and Software for Education(沒有網址沒有 DOI) * Such an observation related to the ratio of correct and incorrect solutions confirmed the results characterizing other online judge systems reported by Manzoor (2006). This proves that the proposed GUI is ergonomic as well as user-friendly. * 好像是某篇跟評估 GUI 直不直觀/友不友善有關的論文 * [ ] [Perspectives on Computer Science Competitions for (High School) Students](https://bwinf.de/competition-workshop/Submissions/13_Manzoor.pdf)(標題好像有改過) * Following the guidelines for preparing systematic literature reviews (Keele University 2007; Kitchenham et al. 2009), ... * 如果你要寫 Review paper 可以看這篇 * [ ] [Guidelines for performing systematic literature reviews in software engineering](https://www.researchgate.net/profile/Barbara-Kitchenham/publication/302924724_Guidelines_for_performing_Systematic_Literature_Reviews_in_Software_Engineering/links/61712932766c4a211c03a6f7/Guidelines-for-performing-Systematic-Literature-Reviews-in-Software-Engineering.pdf) * [ ] [Systematic literature reviews in software engineering – A systematic literature review](https://www.sciencedirect.com/science/article/abs/pii/S0950584908001390?via%3Dihub)