當前位置: 妍妍網 > 碼農

手寫 OJ 系統,真的很難麽?

2024-05-19碼農

大家好,我是魚皮。之前 全程直播帶大家手把手做了一個 OJ 線上判題系統。

看得出在很多同學的印象中,實作 OJ 系統並不是一件容易的事。所以我在第一期重點講解了 OJ 系統的概念、實作重點、核心業務流程、以及 5 種 主流的 OJ 系統實作方案。

直播帶大家畫的核心業務流程時序圖:

給大家分享了 5 種主流的 OJ 系統實作方案,看完之後也許就不會覺得 OJ 系統很難實作了,動手能力強的同學可以自己試試~

主流 OJ 系統實作方案

首先要清楚,成熟的 OJ 系統往往需要支持多種不同的程式語言,自主實作要花費大量的精力、也需要很多技術和考慮,所以核心原則是:能用別人現成的,就不要自己寫!

方案 1:用現成的 OJ 系統

網上有很多開源的 OJ 計畫,比如青島 OJ、HustOJ 等,可以直接下載開原始碼自己部署。

比較推薦的是 judge0,這是一個非常成熟的商業 OJ 計畫,支持 60 多種程式語言!

程式碼:https://github.com/judge0/judge0

支持免費自部署、公有雲、私有雲部署等:

方案 2:用現成的服務

如果你不希望完整部署一套大而全的程式碼,只是想復用他人已經實作的、最復雜的判題邏輯,那麽可以直接使用現成的判題 API、或者現成的程式碼沙箱等服務。

比如 judge0 提供的判題 API,非常方便易用。只需要透過 HTTP 呼叫 submissions 判題介面,把使用者的程式碼、輸入值、預期的執行結果作為請求參數發送給 judge0 的伺服器,它就能自動幫你編譯執行程式,並且返回程式的執行結果。

如下圖,發送了一段打印 "hello world" 的程式,得到了程式執行的時間、狀態等:

地址:https://rapidapi.com/judge0-official/api/judge0-ce

方案 3:自主開發

這種方式就不多說了,判題服務和程式碼沙箱都要自己實作,適合學習,但不適用於商業計畫。我這次帶大家做的 OJ 系統,就選擇了自主開發,主打一個學習。

方案 4:利用 AI 實作程式碼沙箱

現在 AI 的能力已經十分強大了,我們可以把各種本來很復雜的功能直接交給 AI 來實作。

比如把 AI 當做程式碼沙箱,我們直接扔給他一段程式碼、輸入參數,問他能否得到預期的結果,就實作了線上判題邏輯!

如下圖:

之前帶大家做的 ,就是把 AI 當做了智慧數據分析師,來生成圖表和分析結論。

只要你腦洞夠大,AI + 編程 = 無限的可能~

方案 5:移花接木

這種方式最有意思、也最 「缺德」。很多同學估計想不到。

那就是可以透過讓程式來操作模擬瀏覽器的方式,用別人已經開發好的 OJ 系統來幫咱們判題。

比如使用 Puppeteer + 無頭瀏覽器,把咱們系統使用者送出的程式碼,像人一樣輸入到別人的 OJ 網頁中,讓程式點選送出按鈕,並且等別人的 OJ 系統返回判題結果後,再把這個結果返回給我們自己的使用者。

這種方式的缺點就是把核心流程交給了別人,如果別人服務掛了,你的服務也就掛了;而且別人 OJ 系統不支持的題目,可能你也支持不了。

學習計畫

第一期的內容是完全免費公開的,感興趣的同學可以看回放。這個計畫的手把手視訊教程、筆記、源碼、簡歷寫法、面試題解 可見。

編程導航:https://yupi.icu

第一期錄制檔: https://meeting.tencent.com/v2/cloud-record/share?id=e3a06615-ae78-41be-8f7d-c57e4948f046&from=3

存取密碼:WkFq

往期推薦