HydroOJ 从入门到入土(19)导入题解和标程、题目数据统计(>=4.12.0)
题解和 std 可以导入了,导出还会远吗?
一、导入题解和标程
新版本更新了这个功能,方便从其他题库导入数据了。准备更新一下之前的 hydrolizer ,更新之前先做一下测试。
1. 目录结构
根据 @undefined,题解和标程 std 应该分别放置在 solution
和 std
目录,这两个目录应该 和testdata同目录
。同时,@undefined 给出的样例中,题解为 md
格式,std为 cc
格式。但至于其他格式是否可以,他只说了 能在语言设置找到对应的语言就行
。
为了验证具体使用方法,本次题目测试结构如下:
.
├── .DS_Store
├── problem.yaml
├── problem_zh.md
├── solution
│ ├── .DS_Store
│ ├── 11.py
│ ├── 22.pdf
│ ├── cpp.cpp
│ ├── jj1.png
│ ├── 题解.md
│ ├── 未命名文稿.docx
│ ├── 题解的副本.txt
│ ├── 未命名表格.xlsx
│ └── 未命名幻灯片.pptx
├── std
│ ├── .DS_Store
│ ├── a.cc
│ ├── a.cpp
│ ├── b.cpp
│ ├── c.cc
│ ├── d.txt
│ ├── x.py
│ └── y.py3
└── testdata
├── 1.in
├── 1.out
└── config.yaml
特别说明:这里的 .DS_Store
是 mac 系统上一个臭名昭著的隐藏文件,只要打开过的文件夹都有,类似于以前 win 上的 desktop.ini
。
2. 测试结果
- 题目可以正常导入
- 导入之后会自动多出 5 条评测记录,4AC + 1System Error。点进去查看那个System Error,发现报错是
不支持的语言 DS_Store。
(省略问候苹果 1w 字。。) cpp
的 std 可以正常评测,但是不显示语言。txt
,py
和py3
的文件直接没测,被忽略了。- 题解和标程的文件名可以为中文。
- 题解有 10 条。没错,所有格式的文件全导进去了。但是方式是全部以纯文本格式读入,然后以 Markdown 格式来显示,所以非纯文本格式的题解(docx, pdf...还有那个万恶的 .DS_Store!)全部乱码,代码格式的题解没了换行。
3. 第二次测试
想起来去看了下源码(L517-526),发现题解确实不挑食,而 std 评测最多导入 5 条, py
没评测应该是数量超了。
另外,虽然 cpp
比较特殊,可以在没有对应语言设置
的条件下运行,但是在 语言
一栏并不会显示所用语言,在题目 统计
中也没法单独选中这个语言进行筛选,只能在所有语言
中显示,所以决定给他加一个语言设置
试试。
于是第二次测试。
cpp:
compile: /usr/bin/g++ -Wall -std=c++14 -o foo foo.cpp -lm -I/include
code_file: foo.cpp
display: C++
highlight: cpp
monaco: cpp
题目结构如下:
.
├── problem.yaml
├── problem_zh.md
├── solution
│ ├── 题解2.html
│ └── 题解.md
├── std
│ ├── d.txt
│ ├── x.py
│ ├── x的副本.py.py3
│ └── y.py3
└── testdata
├── 1.in
├── 1.out
└── config.yaml
测试结果:
std 文件 | 测试结果 | 语言 |
---|---|---|
d.txt |
System Error: 不支持的语言 txt。 |
|
x.py |
100 AC | Python |
x的副本.py.py3 |
100 AC | Python |
y.py3 |
System Error: 不支持的语言 py3。 |
|
a.cpp |
100 AC | CPP |
html
的题解,只有跟 Markdown 相容的部分可以正常解析,其他部分还是会直接文本显示然后挤在一起。
4. 总结:
关于题解:
- 如果题目文件夹内存在
solution
文件夹并且文件夹内存在文件,OJ 会将文件夹内所有文件强制以Markdown 格式上传到题解
。 - 为避免乱码或者格式错误,必须以
md
格式存放题解。 - 为避免上传多余文件(尤其是 mac 系统),一定要注意过滤垃圾文件(下附方法)。
关于标程(std):
- 如果题目文件夹内存在
std
文件夹并且文件夹内存在文件,OJ 会将文件夹内所有文件强制送到评测机进行评测。 - 目前版本(4.12.2)最大评测
std
的数量为 5 个。 std
的格式(后缀名)需要与语言设置
里的完全一致。比如,语言设置
中有个类型是py.python3
,如果则想评测此类型的文件,文件的后缀名必须是.py.py3
而不能是.py3
- 对于常用的
cpp
格式,可以在语言设置
中新增一个cpp
类型,但显得有些多余。所以我倾向于把原有的cc
格式全部改为cpp
格式来解决这个问题。 - 这个标程功能应该是用来检验题目正确性的,应该能检测出 std 在当前 OJ 的环境下,会不会 TLE 或者 MLE,或者出现不同编译器带来的 RE,等等。
关于复制:
- 复制题目的时候,不会复制题解和评测记录。
- 如果希望显示复制题目的来源,可以根据官网上@Milmon 的Markdown插件,自己写个前端插件。 具体可以看这篇博客。
去除 .DS_Store 的解决方法
不要用自带的右键 压缩
,使用专门的压缩软件(比如 macZip),然后过滤掉 .DS_Store
或者隐藏文件即可。
二、题目数据统计
更新到 4.12.0
之后,题目右侧 文件
下方会出现一个 统计
,点开之后可以看到这道题提交答案的详细的统计情况。
1. 范围
-
所有人都可以看到
-
可以统计到包括
作业
和比赛
的所有提交记录,比较方便。 -
只统计 AC 代码。
2. 筛选选项
项目 | 排序 | 语言 |
---|---|---|
运行时间 | ASC(升序) | 所有语言 |
内存占用 | DESC(降序) | C++ |
代码长度 | Python | |
提交时间 | ... |
3. 无关紧要的小 bug
-
已提 issue(#809)
-
在下方
递交统计
中,对于上传题目时自带的 std 评测,似乎只统计最后一次的评测记录。 -
而且此前的题目多次删除并重新导入之后,题目统计中会带着之前所有这道题的提交记录。