新題庫,新快樂,新痛苦。
一、想法
有了多種題庫之後,常常會遇到大量題庫無法轉化到自己的 OJ 上。每次都要重新手寫解析器,非常浪費時間,於是抽出了這個工具。
本工具可以將抽取好的資訊自動組裝成符合 HydroOJ 格式的題目並自動壓縮,解決後半部分的轉化工作。
二、實現
1. 準備包和相應環境
包:https://github.com/15921483570/hydrolizer (有用可以點個star)
環境:在包內執行 pip install -r requirements.txt
2. 使用
只需匯入本包後,按照範例,將所需資訊以字典形式傳入 Hydrolizer()
即可。
如需將 Hydrolizer.hpath
目錄內的所有題目資料夾打包,可以直接呼叫 Hydrolizer.zipzip()
。打包好的檔案可以直接上傳 HydroOJ 使用。
至於原始檔的資訊抽取,很遺憾,因原始檔種類多樣,無法統一寫解析,只能根據實際情況,自行另寫一個解析器以完成前半部分工作,本工具僅能實現後半部分工作。
3. 例子
import hydrolizer
fname = "testttt"
pid = 1
data_src = os.path.join('test', 'data')
d = {
# 基本屬性
"fname": fname, # 必填
"data_src": data_src, # 評測資料來源資料夾路徑,預設值為'',如無資料會報警告
# 下載外部檔案所需資訊
"headers": {}, # 預設值為 '',如無資料可刪除此行
"cookies": {}, # 預設值為 {},如無資料可刪除此行
"ignore": [], # 遮蔽網址關鍵詞列表, 格式為['遮蔽詞1', '遮蔽詞2', ...],預設值為 [],如無資料可刪除此行
# problem.md, 文字部分會自動從 html 格式轉為 Markdown
"bg": "背景", # 預設值為 '',如無資料可刪除此行
"desc": "題目描述 ![](https://abc.com/123.png)", # 預設值為 '',如無資料會報警告,如存在外部圖片連結會自動下載並整理
"infmt": "輸入格式", # 預設值為 '',如無資料可刪除此行
"outfmt": "輸出格式", # 預設值為 '',如無資料可刪除此行
"trans": "題目大意", # 預設值為 '',如無資料可刪除此行
"samples": [['1', '2'], ['2', '3']], # 必填,格式為:[第1組資料[輸入,輸出], 第2組資料[輸入,輸出], ...]
# 如無樣例資料會報 ValueError, 如某次輸入輸出均為空會報警告
"hint": "提示", # 預設值為 '',如無資料可刪除此行
# problem.yaml
"pid": f"P{pid}", # 數字或字串,預設值為'P1000'
"owner": 2, # 預設值為 2,如無特別要求可刪除此行
"title": "買筆", # 必填,如無資料會報 ValueError
"tags": ['選擇'], # 預設值為 None,格式為['標籤1','標籤2', ...],如無特別要求可刪除此行
"difficulty": 1, # 預設值為 0,如無特別要求可刪除此行
# ./testdata/config.yaml
"tp": 'default', # 題目型別,預設值為 'default',如無特別要求可刪除此行
"tm": 1000, # 限制時間,預設值為 1000,如無特別要求可刪除此行
"mem": 256, # 限制記憶體,預設值為 256,如無特別要求可刪除此行
# 以上三項若全部為預設值,則不會生成 config.yaml 檔案,評測時 oj 會自動處理
}
Hydrolizer.DEFAULT_MEMORY = 256 # 可根據題目實際情況調整預設限制記憶體,減少生成大量無效 config.yaml
Hydrolizer(**d) #
Hydrolizer.zipzip() # 打包 Hydrolizer.hpath 目錄內的所有資料夾到 Hydrolizer.hpath/000.zip
三、提示
包內自帶一個 test 用例,可以直接執行 __init__.py
檔案檢視使用效果。