icpc-jag / rime Goto Github PK
View Code? Open in Web Editor NEWRime: Automation Tool for Programming Contest Organizers
License: MIT License
Rime: Automation Tool for Programming Contest Organizers
License: MIT License
制約は n<=10^5 なのに n<=10^3 の入力しかありませんでしたーをチェックしたい
ストレステストをコマンドで自動的に出来るようにしたい。
rime stress_test 100 を叩くとrime testが100回実行される挙動を想定してます。
シードはRIME_SEEDがdefineされているとか環境変数に入れるとか。
固定ケースは除くようになっていると良さそう。
flake8 あたりが通るようになるといいかんじです。
インデント幅が2なのもついでに直せるといいですが相当しんどいので、それだけ後回しでいいかも。
CIでrimeを走らせていると大量の出力が出てしまうので抑制したいが、
/dev/nullに捨てると全部見えなくなってしまうので適当に省略した出力を表示したい。
具体的にはprogress=Trueの出力を抑制したい。
TLE解がWAになった場合にエラーを出したい
SOLUTIONで expected_status=['AC','TLE'] と書ければ良さそう
命名規則をpep8に準拠させる。
pep8-namingを入れてflake8が走るようになればOK。
output judgeありの場合、diffファイルが正しい出力になっているかのチェックが行われない。
誤差ジャッジの場合は比較が行われるので問題になりにくいが、constructiveな問題の場合、一切チェックが行われない可能性がある。
rimeにlintを通す作業でrime_initが漏れてて動かなかったので修正する
rime add をした時に生成される PROJECT/PROBLEM/SOLUTION/TESTSET の雛形はソースコードに埋め込まれているが、これらを指定できるようにしたい。
具体的には、 common 以下に雛形が用意されていればそれを使い、無ければデフォルトの雛形を使うようにしたい。
--version
ではなく-version
が正しいオプション。
rime/rime/plugins/summary/summary.py
Line 136 in 44aae08
rime/rime/plugins/summary/summary.py
Line 140 in 44aae08
wikify/wikify_full は最初にcleanしてから走るようになっているが、cleanするかどうかをオプションで指定できるようにしたい。
Line 69 in 0033862
rime/rime/plugins/wikify_full.py
Line 86 in 0033862
rime/rime/plugins/htmlify_full.py
Line 81 in 0033862
現行のicpc_mergerの挙動は、ファイルをそのままファイル名順に結合するものであると認識しています。
ところで、例えば手動生成のケースなどは9_corner_*.inなどの名前をつけることが多く、結果的に「コーナーケースが入力の最後の方にまとまって配置される」という傾向が生じてしまうことがあります。
(模擬)国内予選の形式では選手が入力ファイルを閲覧できるため、選手が最後の方のテストケースを目視してコーナーケースのデバッグに使えてしまう可能性があり、これは練習機会の提供という意図にそぐわないのではないかという懸念を持っています。
このような傾向を避けるため、サンプル以外のケースについてはマージ前にシャッフルした方が良いのではないかと考えたのですが、これはどの程度妥当あるいは有益でしょうか。
Rimeプロジェクト外でrime helpとするとPROJECT not found.になる
早稲田の一部の人で、僕がforkした https://github.com/tossy310/rime/tree/markdownify を使って、wikify_full と同内容のものをmarkdown形式出力したものを使っています。
需要があれば、上の実装をクリーンアップしたものを PR に出したいと思うのですが、いかがでしょうか。
GitHub 上で作問作業をする場合、htmlifyの出力をgithub pagesから見ることも可能ですが、markdownのほうが特別な追加作業なしで見れるので便利でした。
(一方、markdownの表現力が弱いため、表が多少見にくくなりがちです。)
Lint とか unit test とかを CI で走らせたい
AttributeError: module 'time' has no attribute 'clock'
Line 404 in 44aae08
現在 @not522 さんの助言もあり、標題の件について検討しています。
ここで取り組みたいことは、push時の各種情報のArtifact化であり、成果物はexample以下に配置しようと考えています。
ここでArtifact化させる情報は次の二点を想定しています。
現在実験的にコードを書いており、下記のような形で動作することができています。
https://github.com/tokoharu/rime/runs/685658254
現在の問題点は次の点かと思います。コメントなどいただければ幸いです。
特にインストール周りの更新が必要
Macにhomebrewでgccをインストールして使っているので,いつもインストール後に basic/codes.py を直接編集して gcc -> gcc-7, g++ -> g++-7 と書き換えているのですが .rimerc
のような設定ファイルに書けるようになると嬉しいです。
Good to have a way to specify default compile flags (e.g. -O2) in PROJECT file.
pip でインストールする時に GitHub URL を指定するのではなくて
$ pip install rime
だけでよくなるとよさそうです。
subtask_testsetのinput_patternsに複数ファイル指定したときカンマ区切りではなくスペース区切りで出力されてしまう
TODO: 確認する
現状, upload_script を絶対パスで指定しないと動きませんが, base_dir からの相対パスで指定できると嬉しいです.
相対パスを指定して rime upload
を dry-run すると,以下のコードの 216 行目で AttributeError: 'NoneType' object has no attribute 'startswith'
が生じます.
rime/rime/plugins/judge_system/atcoder.py
Lines 210 to 218 in 3e1690a
211 行目の if 文はスクリプトのパスが base_dir と join されるので通りますが,次の 215 行目では join されていないので,スクリプトが読み込めていないのだと考えます.
Rimeの設計を大幅に見直す検討をしています。特にアーキテクチャが複雑すぎて機能追加が難しくなっている点を解決したいと思っています。
参照 : icpc-jag/rime-plus#9
(参考)
最近よく使われている競プロツール
他の作問支援ツール
以下の方針は個人的に考えているもので、開発陣の総意ではありません。コメントで自由に意見をください。
まず、rime-plusでの議論に沿って個人的に考えている解決案を書きます。
開発時とは作問事情が大きく変わっていてますますいろいろな機能を追加する必要がある
Rime+でほぼカバーされているのでは?これ以上特殊なジャッジに対応する必要はなさそう。
メタプログラミングをかなり濫用しているのでアーキテクチャが複雑すぎる
これはその通りでもっとシンプルに書き直した方が良い。とはいえ並列実行をするためにはそれなりに工夫が必要。
Python 2 なので Python 3 への移行が必要
移行済み。
config が JSON とかではなく生 python なのでエディタとか周辺ツールの整備がやりづらい
JSON等に移行しましょう。TOMLも良い感じに見えます。
環境合わせ面倒なのでdockerとかクラウドとかと連携したい
GitHub Actionsで完結するようにすると良い感じになるはず。
静的型くれ
Pythonでも型を書けるようになったので多少はマシな状況になった?
コンパイラを揃える話
GitHub Actionsで緩和されるはず。
リアクティブとか部分点ジャッジ
とりあえずRime+で十分?
配布・非Linux
最近はWSLも出たので現状のままでも大きな問題はないはず。
ビルドシステムの話
makeに任せてしまうというのは並列実行を考えると魅力的ですが、可読性が落ちるのではと懸念しています。
上記を踏まえて、以下のような方針を検討しています。
言語はPythonのまま
元のコードをそのまま活かせるメリットは大きいと思います。
Rime+を本体に統合
plugin機能を廃止
pipでインストールするようになったので、pluginを追加するより本体に機能追加をしてもらう方がやりやすいと思います。
設定ファイルをJSON等に変更
JSONなら外部ライブラリなしで使えるというメリットはありますが、TOMLの方がコメントも書けるなど便利になる可能性はあります。
外部ライブラリを極力減らすことで、pipインストールを上手くできない人が直接Rimeのソースコードを叩いて実行できるようになるメリットはありましたが、そもそもその機能が知られていない上、他でも( #69 (comment) )外部ライブラリを使う話が出ているのであまりこだわる必要はないと思います。
問題文生成機能を追加
Google DocsやGitHubで問題文テンプレートを準備し、サンプルや制約の値などを自動的に挿入する機能を追加したいです。
例えば、library-checker-problemsは同じような形式になっています。
https://github.com/yosupo06/library-checker-problems/blob/master/sample/aplusb/task.md
GitHub Actionsを使った標準的な作問フローを作る
現状のRimeだけでは作問フローが完結せず、他のサービスに依存している面がありました。例えばJAGではPukiWiki・Google Docs・Werckerを使っています。これをRime+GitHubで完結するように設計することで、導入を楽にしたいと思っています。一方、Google Docsなどと連携することでより便利になる可能性もあるので、(pluginではなく)追加のスクリプトなどで対応できるようにしたいと思います。
この方針で試験的に書き直しを進めています。現状はpluginを廃止し機能は本体に取り込み、設定ファイルをJSONに書き直している途中です。
rime-plusはmonkey patchからなるプラグインで作られているが、今後もメンテすることを考えるとデメリットしかなさそうである。本体の方にパッチを反映して単純化したい。
万が一、オリジナル版が欲しくなった場合も pip でバージョン指定すれば十分のはず…
大掛かりな修正になるのでversion分けたほうが良さそう
現状のPROJECT内でコード共有する方式だとscript系言語の解答をうまく投げられない
SOLUTIONで個別に指定して上書きできるようにしたい
Dropbox上でrimeを走らせると大変なことになるので、rime-outを生成せずに実行できるオプションが欲しい。
単に/tmpなどにrime-outを作るのでも良さそう。
ジャッジシステムの仕様の調査が必要
$ CC=gcc-7 CXX=g++-7 rime
rime.py <command> [<options>...] [<args>...]
Rime is a tool for programming contest organizers to automate usual, boring
and error-prone process of problem set preparation. It supports various
programming contest styles like ACM-ICPC, TopCoder, etc. by plugins.
To see a brief description and available options of a command, try:
rime.py help <command>
Commands:
add Add a new target directory.
build Build a target and its dependencies.
clean Clean intermediate files.
help Show help.
htmlify_full Local version of htmlfy_full. (htmlify_full plugin)
pack Pack testsets to export to online judges.
submit Submit solutions to online judges.
test Run tests in a target.
upload Upload testsets to export to online judges.
wikify Upload test results to Pukiwiki. (wikify plugin)
wikify_full Upload all test results to Pukiwiki. (wikify_full plugin)
Global options:
Traceback (most recent call last):
File "/Users/sho-ii/git/regional-2017/.direnv/python-2.7.14/lib/python2.7/site-packages/rime/core/main.py", line 162, in Main
return InternalMain(args)
File "/Users/sho-ii/git/regional-2017/.direnv/python-2.7.14/lib/python2.7/site-packages/rime/core/main.py", line 121, in InternalMain
cmd.PrintHelp(ui)
File "/Users/sho-ii/git/regional-2017/.direnv/python-2.7.14/lib/python2.7/site-packages/rime/core/commands.py", line 112, in PrintHelp
ui.commands[None]._PrintOptionDescription(ui)
File "/Users/sho-ii/git/regional-2017/.direnv/python-2.7.14/lib/python2.7/site-packages/rime/core/commands.py", line 157, in _PrintOptionDescription
(i == 0 and left_col_head or ''), offset)
File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/string.py", line 433, in ljust
return s.ljust(width, *args)
TypeError: an integer is required
以下のコミットで壊れてしまった模様。
テストを走らせた時に、実行時間を表示するところでメモリ量も併記してほしいです。
また、Memory Limit を設定し、テストでMLEを検出したいです。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.