新題庫,新快樂,新痛苦。
一、想法
有了多種題庫之後,常常會遇到大量題庫無法轉化到自己的 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
文件查看使用效果。