HydroOJ 从入门到入土(19)导入题解和标程、题目数据统计(>=4.12.0)

题解和 std 可以导入了,导出还会远吗?

一、导入题解和标程

新版本更新了这个功能,方便从其他题库导入数据了。准备更新一下之前的 hydrolizer ,更新之前先做一下测试。

1. 目录结构

根据 @undefined,题解和标程 std 应该分别放置在 solutionstd 目录,这两个目录应该 和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. 测试结果

  1. 题目可以正常导入
  2. 导入之后会自动多出 5 条评测记录,4AC + 1System Error。点进去查看那个System Error,发现报错是 不支持的语言 DS_Store。 (省略问候苹果 1w 字。。)
  3. cpp 的 std 可以正常评测,但是不显示语言。
  4. txtpypy3 的文件直接没测,被忽略了。
  5. 题解和标程的文件名可以为中文。
  6. 题解有 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 评测,似乎只统计最后一次的评测记录。

  • 而且此前的题目多次删除并重新导入之后,题目统计中会带着之前所有这道题的提交记录。

posted @ 2024-05-13 16:03  Bowen404  阅读(426)  评论(0编辑  收藏  举报