ICPC-TOOLs resolver滚榜单工具使用指南

0.引言:

上周突然临危受命,学校ACM社团要举办校内迎新赛,想要使用滚榜功能让揭晓结果变得更加刺激。奈何本人不打ACM,一开始连滚榜都不知道(苦笑.jpg),不过还是跌跌撞撞把功能实现了,介于网络上这方面的教程实在是凤毛麟角,我就把自己的经验和心得留给以后有需要的同学。

1.官网下载压缩包

首先来到官网下载resolver的压缩包

ICPC Tools

image-20221211140542632

解压下来的目录结构

image-20221211141343610

友情提示:可以先看READMD.pdf ,官方文档比网上的教程更加全面和细致。

举个栗子,其中较为重要的有

命令行实例

  • 这是从CDS服务器拉取的比赛信息
resolver.bat https://169.254.80.194:8443 admin adm1n --presenter --fast 0.7
  --rowDisplayOffset 4 --info

image-20221211142050896

  • 这是从本地文件来获取比赛信息
resolver.bat c:\events.json --singleStep 999

image-20221211142002152

键盘快捷键

  1. Ctrl + q 停止
  2. space or f 下一步
  3. r 上一步
  4. +/= 加速
  5. -/_ 减速
  6. ….

1.5.解决中文乱码的问题

来到lib下的presentation.jar,可以看到我们的字体是Helvetica-Plain.ttf

image-20221211150525755

来到Win10字体文件夹:C:\Windows\Fonts

image-20221211150928661

将一款中文字体添加到presentation.jar的font目录重命名为Helvetica-Plain.ttf就可以了

2.构建xml文件

由于我们选择的方式是从本地文件来加载比赛信息,那么我们就需要按照规定的格式和规范来构建xml文件

这里推荐一下网络上的教程

滚榜程序Resolver源码阅读

icpc-tools resolver 滚榜工具使用指北

就我在实际过程中总结一下

xml文件必须的内容,可以分为以下几个部分:

  1. 比赛基本信息(比赛名称,持续时间之类的, info项)
  2. 比赛区域信息(队伍所属大洲,如亚洲等,我在实际使用的时候以学院作为区域喂的数据, region项)
  3. 判题结果信息(根据OJ的实际情况来,主要是设置各种判题结果怎么处理,比如说CE算不算罚时,每次错误提交算多少罚时之类的,judgement项)
  4. 代码语言信息(随便加一加就好了,实际滚榜并不会用到,但是你需要保证你OJ的提交中的语言都在这里包含了,否则会报错, language项)
  5. 队伍信息(选手信息, team项)
  6. 题目信息(problem项)
  7. 结果信息(对应所有的提交,按格式生成对应的结果信息,run项)
  8. 增加比赛结束标志(finalized项)
<contest>
    <info>
    ...
    </info>

    <region>
    ...
    </region>

    <judgement>
    ...
    </judgement>

    <language>
    ...
    </language>

    <problem>
    ...
    </problem>

    <team>
    ...
    </team>

    <run>
    ...
    </run>

    <finalized>
    ...
    </finalized>
</contest>

1.info

info标签里面记录比赛的有关信息,包括比赛的编号、标题、罚时、开始时间戳、比赛总时长、封榜时间…

info, fianlized标签只能有一个,其他标签可以有多个

<info>
  <length>4:00:00</length>  
  <penalty>20</penalty> 
  <started>False</started> 
  <starttime>1512824400.0</starttime>
  <title>2017 USTB ACM-ICPC Final Contest</title>
  <short-title>2017 USTB ACM-ICPC Final Contest</short-title>
  <scoreboard-freeze-length>0:30:00</scoreboard-freeze-length>
  <contest-id>default--3</contest-id> 
</info>

2.region

region记录比赛选手的区域的相关消息,包括区域编号,名称

<region>
  <external-id>1</external-id>
  <name>School of Computer and Communication Engineering</name>
</region>
<region>
  <external-id>2</external-id>
  <name>School of Automation and Electrical Engineering</name>
</region>

3.judgement

作用是为了配合run项使用,设置不同的结果以及对应的类型,比如可以设置CE不算罚时之类的,注意这里需要能和你自己OJ的提交信息完全匹配上,或者你也可以只设置AC和WA两种状态,然后导出提交的时候处理一下映射。

<judgement>
    <id>1</id>
    <acronym>AC</acronym>
    <name>Yes</name>
    <solved>true</solved>
    <penalty>false</penalty>
</judgement>
<judgement>
    <id>2</id>
    <acronym>WA</acronym>
    <name>No - Wrong Answer</name>
    <solved>false</solved>
    <penalty>true</penalty>
</judgement>
<judgement>
    <id>3</id>
    <acronym>CE</acronym>
    <name>No - Compile Error</name>
    <solved>false</solved>
    <penalty>false</penalty>
</judgement>

4.language

judgement一样,主要是为了配合run使用。

<language>
	<id>1</id>
    <name>C</name>
</language>
<language>
    <id>2</id>
    <name>C++</name>
</language>
<language>
    <id>3</id>
    <name>Java</name>
</language> 

5.team

记录选手的相关信息,包括区域ID,team编号,名称

这里注意external-id一定要跟上面的region的external-id匹配上

<team>
    <id>87</id>
    <external-id>87</external-id>
    <region>School of Computer and Communication Engineering</region>
    <name>Yuncheng Wang</name>
    <university>Yuncheng Wang</university>
</team>  
<team>
    <id>108</id>
    <external-id>108</external-id>
    <region>School of Computer and Communication Engineering</region>
    <name>Jinkai Xue</name>
    <university>Jinkai Xue</university>
</team> 

6.problem

注意注意:这里的ID一定要是从1开始递增(踩过的坑

<problem>
	<id>1</id>
    <letter>A</letter>
    <name>Stones</name>
</problem>
<problem>
    <id>2</id>
    <letter>B</letter>
    <name>Practice of SUOAO</name>
</problem> 

7.run

run标签记录的就是所有选手的提交情况,对应提交的选手编号、对应题号、编程语言、结果、提交时间、比赛开始到提交经过的时间、是否解决、罚时…

judged需要全部为True,status需要全部为done,time比赛开始到提交经过的时间,其他的选项必须严格的匹配前面的标签,例如language、problem、team、result等

<run>
    <id>6</id>
    <judged>True</judged>
    <language>C++</language>
    <problem>2</problem>
    <status>done</status>
    <team>69</team>
    <time>471.309999</time>
    <timestamp>1512824871.31</timestamp>
    <solved>false</solved>
    <penalty>true</penalty>
    <result>WA</result>
</run>
<run>
    <id>7</id>
    <judged>True</judged>
    <language>C</language>
    <problem>4</problem>
    <status>done</status>
    <team>99</team>
    <time>494.562765</time>
    <timestamp>1512824894.56</timestamp>
    <solved>false</solved>
    <penalty>true</penalty>
    <result>WA</result>
</run> 

8.finalized

time直接设为0即可

timestamp是比赛结束时间的时间戳

last_gold,last_silver,last_bronze这三个指的是金牌、银牌、铜牌的最后一名是多少,比如sample中就代表金牌一个,银牌三个,铜牌五个

实际上设置的金银牌数量并没有生效,不过后面我们可以个性化设置

 <finalized>
    <last_gold>1</last_gold>
    <last_silver>4</last_silver>
    <last_bronze>9</last_bronze>
    <time>0</time>
    <timestamp>1512838800.0</timestamp>
</finalized> 

3.生成contest.json文件

在resolver根目录双击运行awards.bat

image-20221211144811616

很明显这里就有我在上面介绍过的从远程cds加载还是从本地文件加载

image-20221211144923800

我们选择从本机文件加载

image-20221211145054881

运行后的结果如下:

image-20221211145220217

右上方Add Awards,我们就可以自行添加awards的种类、数量等

以奖牌为例,这里奖牌的个数上限为10,怎么自行修改

image-20221211145349633

回到主页面选中,这里就可以为选手添加指定的award和备注(在滚榜程序中会以它展示)以及该奖项的展示方式

image-20221211151346676

image-20221211145542761

或者自定义奖项

image-20221211145833026

完成一系列配置就可以save生成json文件了

4.运行resolver.bat

最后一步就是来到resolver根目录运行

resolver.bat 你的json文件位置

image-20221211150216791

大功告成!按照上面的键盘快捷键操作就可以了

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ACM/ICPC比赛成绩会按照一定的规则计算各位参赛者的名次并实时显示排行榜,计算规则主要参考解题的数量及罚时,解题数量越多,罚时越少,则排名越高。 解题数量很容易计算,只需考察比赛中标记为“Accepted”的题数即可。罚时计算则相对复杂,对于提交到竞赛系统中的每道题目,系统会给出一个罚时,为从比赛开始到该题提交的代码第一次被“Accepted”的时间。请注意,只是第一次“Accepted”。对于“Accepted”之前的每次提交,都有20分钟的罚时,但如果该题目最终未解出,则不计罚时。 先在有一个比赛的题目通过情况记录,请生成该比赛的排行榜。 示例输入: 2008-04-25 18:00:00 2008-04-25 23:30:00 1000 1001 1002 1003 1004 38 602203621 1002 Accepted 756K 30MS C++ 2008-04-25 18:04:59 37 liheyuan 1002 Wrong_Answer 768K 10MS C++ 2008-04-25 18:28:05 36 ftest 1000 Accepted 888K 10MS C++ 2008-04-25 21:30:32 35 ftest 1000 Accepted 904K 10MS C++ 2008-04-25 21:30:55 34 gaojianwei 1000 Accepted 768K 10MS C 2008-04-25 22:15:58 33 gaojianwei 1001 Wrong_Answer 904K 10MS C 2008-04-25 22:18:01 32 gaojianwei 1004 Accepted 768K 10MS C 2008-04-25 22:24:23 31 lzz 1000 Accepted 904K 10MS C++ 2008-04-25 23:29:27 30 lzz 1001 Wrong_Answer 904K 10MS C++ 2008-04-25 23:30:17 示例输出: Rank Name Solved 1000 1001 1002 1003 1004 Penalty 1 gaojianwei 2 4:15:58 -1 0 0 4:24:23 8:40:21 2 602203621 1 0 0 0:04:59 0 0 0:04:59 3 ftest 1 3:30:32 0 0 0 0 3:30:32 4 lzz 1 5:29:27 0 0 0 0 5:29:27 5 liheyuan 0 0 0 -1 0 0 0:00:00
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奥库甘道夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值