Codeforces Tool 是 Codeforces 的命令行界面的工具。
这玩意儿挺快、挺小、挺强大,还跨平台哦。
- 支持 Codeforces 中的所有编程语言
- 支持 contests 和 gym
- 提交代码
- 动态刷新提交后的情况
- 拉取问题的样例
- 本地编译和测试样例
- 拉取某人的所有代码
- 从指定模板生成代码(包括时间戳,作者等信息)
- 列出某场比赛的所有题目的整体信息
- 用默认的网页浏览器打开题目页面、榜单、提交页面等
- 丰富多彩的命令行
欢迎大家一起完善这个工具呀,欢迎Pull requests。
你可以从这里直接下载一个可执行文件,直接用就好啦。
或者你可以把整个 repo 给 clone 下来,然后自己编译 (go >= 1.12):
$ git clone https://github.com/xalanq/cf-tool
$ cd cf-tool
$ go build -ldflags "-s -w" cf.go
以下简单模拟一场比赛的流程。
cf race 1136
要开始打 1136 这场比赛了!其中 1136 可以从比赛的链接获取,比方说这个例子的比赛链接就为https://codeforces.com/contest/1136。
如果比赛还未开始,则该命令会进行倒计时。比赛已开始或倒计时完后,工具会自动用默认浏览器打开比赛的题目界面与所有题目页面,并拉取样例到本地。
cd 1136/a
进入 A 题的目录,此时该目录下会包含该题的样例。
cf gen
用默认模板生成一份代码,代码文件名默认是题目的 ID。
vim a.cpp
用 Vim 写代码(这取决于你)。
cf test
编译并测试样例。
cf submit
提交代码。
cf list
查看当前比赛各个题目的信息。
cf stand
用浏览器打开榜单,查看排名。
首先你得用 "cf config" 命令来配置一下用户名、密码和代码模板
如果你想用本工具打比赛,那么最好用 "cf race 1111" 命令,其中 "1111" 是比赛的 id
支持的命令:
cf config
cf submit [(<contest-id> <problem-id>)] [<filename>]
cf list [<contest-id>]
cf parse [<contest-id>] [<problem-id>]
cf gen [<alias>]
cf test [<filename>]
cf watch [all] [<contest-id>] [<problem-id>]
cf open [<contest-id>] [<problem-id>]
cf stand [<contest-id>]
cf sid [<submission-id>] [<contest-id>]
cf race <contest-id>
cf pull [ac] [<contest-id>] [<problem-id>]
cf clone [ac] <username>
cf upgrade
例子:
cf config 配置 cf-tool。
cf submit 如果当前路径是 "<contest-id>/<problem-id>" 那 cf 会找到匹配某个模板的代码,
然后提交到 <contest-id> 这场比赛的 <problem-id> 题目。
cf submit a.cpp
cf submit 100 a
cf submit 100 a a.cpp
cf list 列出当前比赛的题目通过、时限等信息。
cf list 1119
cf parse 100 获取比赛 id 为 100 的所有题目的样例到文件夹 "./100/<problem-id>" 下。
cf parse 100 a 获取比赛 id 为 100 的题目 a 的样例到文件夹 "./100/a" 下。
cf parse 获取当前比赛的当前题目到当前文件夹下。
cf gen 用默认的模板生成一份代码到当前文件夹下。
cf gen cpp 用名字为 "cpp" 的模板来生成一份代码到当前文件夹下。
cf test 在当前目录下执行模板里的命令,并测试全部样例。如果你想加一组新的测试数据,
新建两个文件 "inK.txt" 和 "ansK.txt" 即可,其中 K 是包含 0~9 的字符串。
cf watch 查看自己在当前比赛的最后 10 次提交结果。
cf watch all 查看自己在当前比赛的全部提交结果
cf open 1136 a 用默认的浏览器打开比赛 id 为 1136 的题目 a。
cf open 1136 用默认的浏览器打开比赛 id 为 1136 的总览页面。
cf stand 用默认的浏览器打开当前比赛的榜单。
cf sid 52531875 用默认的浏览器打开 52531875 这个提交页面。
cf sid 打开最后一次提交的页面。
cf race 1136 如果比赛还未开始且进入倒计时,则该命令会倒计时。倒计时完后,会自动打开一些
题目页面并拉取样例。
cf pull 100 拉取比赛 id 为 100 每道题的最新代码到文件夹 "./100/<problem-id>" 下。
cf pull 100 a 拉取比赛 id 为 100 的题目 a 的最新代码到文件夹 "./100/a" 下。
cf pull ac 100 a 拉取比赛 id 为 100 的题目 a 的 AC 代码。
cf pull 拉取当前题目的最新代码到当前文件夹下。
cf clone xalanq 拉取 xalanq 的所有提交代码。
cf upgrade 从 GitHub 更新 "cf" 到最新版。
注意:
<problem-id> 表示题目的 id,比如 "a" 或者 "A",不区分大小写。
<contest-id> 表示比赛 id,你可以从比赛链接找到。比如 "https://codeforces.com/contest/1119"
这个链接就是 id 为 "1119" 的比赛。
<alias> 模板的名字。
储存的文件:
cf 会保存数据到以下文件:
"~/.cfconfig" 这是配置文件,包括用户名、加密后的密码等。
"~/.cfsession" 这是会话文件,包括 cookies、用户名等。
"~" 这个符号是系统当前用户的主文件夹。
模板:
你可以在你的代码里插入一些标识符,当用 cf 生成代码的时候,标识符会按照以下规则替换:
$%U%$ 用户名
$%Y%$ 年 (e.g. 2019)
$%M%$ 月 (e.g. 04)
$%D%$ 日 (e.g. 09)
$%h%$ 时 (e.g. 08)
$%m%$ 分 (e.g. 05)
$%s%$ 秒 (e.g. 00)
模板内的脚本:
模板支持三个脚本命令,当使用 "cf test" 时会依次执行:
- before_script (只会执行一次)
- script (有多少个样例就会执行多少次)
- after_script (只会执行一次)
"before_script" 或者 "after_script" 你可以根据需要来设置,也可以设置为空。
在 "script" 里你必须要运行你的程序,通过标准 IO 来输入/输出数据(不用重定向)。
你在这些脚本命令里也能插入一些标识符,这些标识符会按照以下规则替换:
$%path%$ 代码的路径 (不包括 $%full%$, 比如 "/home/xalanq/")
$%full%$ 代码的文件名 (比如 "a.cpp")
$%file%$ 代码的文件名 (不包括后缀,比如 "a")
$%rand%$ 一个长度为 8 的随机字符串 (只包括 "a-z" "0-9" 范围内的字符)
Options:
-h --help
--version
当这份模板被 cf gen
生成时,模板内部的占位符会替换成相应的内容。
$%U%$ 用户名
$%Y%$ 年 (e.g. 2019)
$%M%$ 月 (e.g. 04)
$%D%$ 日 (e.g. 09)
$%h%$ 时 (e.g. 08)
$%m%$ 分 (e.g. 05)
$%s%$ 秒 (e.g. 00)
/* Generated by powerful Codeforces Tool
* You can download the binary file in here https://github.com/xalanq/cf-tool
* Author: $%U%$
* Time: $%Y%$-$%M%$-$%D%$ $%h%$:$%m%$:$%s%$
**/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
return 0;
}
Codeforces Tool 是命令行界面的工具,你应该在终端里运行这个工具。
你应该将 cf
这个程序放到一个已经加入到系统变量 PATH 的路径里 (比如说 Linux 里的 /usr/bin/
)。
或者你直接去搜 "怎样添加路径到系统变量 PATH"。
新建两个额外的测试数据文件 inK.txt
和 ansK.txt
(K 是包含 0~9 的字符串)。
使用这个工具 Infinidat/infi.docopt_completion 即可。
注意:如果有一个新版本发布(尤其是添加了新命令),你应该重新运行 docopt-completion cf
。