Comments (16)
特殊ジャッジには以下の3つの形態がありそうです。
- 小数の出力で誤差を許容
- 複数解のうち1つを出力すればOK
- インタラクティブ問題
1については問題文から許容誤差と絶対誤差・相対誤差のどちら(あるいは両方)を容認するかを抽出した上で、できれば出力形式も抽出して、小数表示のところは許容誤差内にあるかジャッジすることになると思います。
2, 3については判定スクリプトをユーザーに書いてもらって、そのスクリプトを走らせた結果で正解を判定することになると思います。2. の場合は判定スクリプト関数などでコードに埋め込んだ方が使いやすいかもです。その場合は、標準エラー出力かメイン関数の戻り値などで正解を判定することになります。
3. の判定スクリプトは場合によってはatcoderジャッジサーバーが用意したものを再現するのが困難(もしかすると元の問題を解くより難しくなるかも)なので、あまり需要がないかもです。
以上から、
- どの形態のジャッジなのか(通常、小数、複数解、インタラクティブ)
- 複数解、インタラクティブの場合はジャッジスクリプトの名前や仕様はどうするか?
を考える必要があります。ひとまず書いてみてもいいんですかね?
from atcoder-tools.
ひとまず、浮動小数対応バージョンを作りたいのですが、各問題のディレクトリに.configみたいなファイルを作成してそこにジャッジタイプ(通常、小数、複数解、インタラクティブ)のどれかを記述するという仕様でいかがでしょう?
from atcoder-tools.
ひとまず、浮動小数対応バージョンを作りたいのですが、各問題のディレクトリに.configみたいなファイルを作成してそこにジャッジタイプ(通常、小数、複数解、インタラクティブ)のどれかを記述するという仕様でいかがでしょう?
いいと思います。
現状、metadata.json
というのが毎回ディレクトリに生成されて、submitコマンドとかtestで使ってるので、これを使い回すという手があります。中身はこんなかんじです。多分judge_type
とかいうフィールドを作るとよさそうです。
{
"code_filename": "main.cpp",
"lang": "cpp",
"problem": {
"alphabet": "A",
"contest": {
"contest_id": "jsc2019-qual"
},
"problem_id": "jsc2019_qual_a"
},
"sample_in_pattern": "in_*.txt",
"sample_out_pattern": "out_*.txt"
}
from atcoder-tools.
おぉーありましたか!気づかなかったです。あんまり意味ないですが、ジャッジタイプだけ抽出するっていうのやってみますかねー
from atcoder-tools.
意味は十分にあると思います。よろしくおねがいします。
この辺のロジックに何か追加してみるとよいかなと思います。
from atcoder-tools.
はい!ちょうどそこを見ていました。
"judge_type":"normal" | "float" | "multiple" | "interactive"
で"float"の場合は
"error": "absolute" | "relative"
"diff": "10^-??"
みたいに記述されてる感じですね
from atcoder-tools.
はい!まさにそんなかんじで!ただerrorとdiffが実は意図を取り違えやすいので、それを阻止するために少し構造化してもらえますか?
"judge" : {
"type": "normal" | "float" | "multiple" | "interactive"
"error_type": "absolute" | "relative" | "absolute_or_relative" | null
"diff" : 小数 | null
}
diffはnumberのまま入れるのか気持ち悪いので何かしらの形で正規化するべきだとは思いますが、どうしたらいいんだろう...誤差とかこわいけどそこまでシビアになるのはアレなのでstringじゃなくて単純にnumberとして入れてもいいかもしれない。
UX的に人間が視覚的に見たときにわかりやすくすべきかという議論はあると思われますが、そもそもmetadata.jsonを見ることはあまり想定してないので、ジャッジ用のスクリプトが常にどんな値を誤差として使ったかを指数表記させれば良いという話はあります。
from atcoder-tools.
#164 で複数解・インタラクティブの実装が進んでいます。
@chaemon さんの発想でインタラクティブの実装が複数解にも再利用できることが分かったので、その方針でいきましょう。
from atcoder-tools.
複数解のジャッジとインタラクティブについて、ジャッジコードをユーザーに書いてもらってそれを使ってジャッジする方法を使っています。そこで、複数解・インタラクティブを検出したとき、あるいはatcoder-tools setで複数解・インタラクティブが選択されたときには以下のようなテンプレートも生成されるようにしたいと思っていますがいかがでしょうか?これはC++バージョンであり、他の言語のバージョンも追加していく予定です。
/////////start template
#include <bits/stdc++.h>
using namespace std;
void quitAC(){
cerr<<"Judge: AC"<<endl;
exit(0);
}
void quitWA(const string message = ""){
cerr<<"Judge: WA"<<" ( "<<message<<" )"<<endl;
exit(1);
}
/* for interactive */
const string header_prefix = "Input Output\n----------------------------------";
const string input_prefix = " ";
string input(){
string s;
getline(cin,s);
cerr<<input_prefix<<s<<endl;
return s;
}
void output(const string &s){
cerr<<s<<endl;
cout<<s<<endl;
}
/* end for interactive */
///////////////////end template
typedef long long Int;
int main(int argc, char *argv[]){
//////////////// start template
/* for interactive */
cerr<<header_prefix<<endl;
ifstream in_s_2(argv[1]);
while(in_s_2){
string s;
getline(in_s_2,s);
cout<<s<<endl;
cerr<<s<<endl;
}
/* end for interactive */
ifstream in_s(argv[1]), out_s(argv[2]);
//////////////// end template
}
from atcoder-tools.
良いと思います。
今考えている問題は
-
atcoder-tools genの時だけjudge.cpp生成すると、あとでそれが欲しくなったときに不便
- @chaemonさんが提案してくださった
atcoder-tools set
みたいな発想が多分いちばん良い気がします。
- @chaemonさんが提案してくださった
-
どうユーザーにテンプレートに提供するか(別のファイルか単一のtemplateファイルか?)
- とりあえずjudgeを意識することはそんなに無いはずだし、かなり見た目が変わると思うので別ファイルでいいと思う。config fieldは
judge_template=...
- とりあえずjudgeを意識することはそんなに無いはずだし、かなり見た目が変わると思うので別ファイルでいいと思う。config fieldは
-
ディレクトリに複数実行ファイルが存在することになるが、実行ファイルの自動検出に失敗しないか?
- judgeプログラムの名前を予めconfigで指定できるようにした上で(
judge_program_name=judge.out
とか?)、metadata.jsonに書きこんでおくのが良さそう。本当はmainプログラムもそうするべきなんですが、judgeプログラムだけを取り除けば十分かな?
- judgeプログラムの名前を予めconfigで指定できるようにした上で(
-
ジャッジに他の言語(例えばpython)を使いたい場合はどうしたらよいか?
judge_lang='cpp'
みたいなconfig fieldを作るとよい?
-
ジャッジテンプレートに何を含むべきか?
- @chaemonさんが載せてくれたcppのたたき台をスタートに考えていきましょう
from atcoder-tools.
コード読んでて気づいたんですが、既存のコードジェネレーターのコードを使ってどうやってstdin以外に適用するか、ちょっと悩ましいですね。コードジェネレーター群の修正が必要そうです。
from atcoder-tools.
void exit_ac(){
cerr<<"Judge: AC"<<endl;
exit(0);
}
void exit_wa(const string message = ""){
cerr<<"Judge: WA"<<" ( "<<message<<" )"<<endl;
exit(1);
}
これは合っても良い気がしますが他はウーム、好みという感じがしますね。
from atcoder-tools.
他は主にインタラクティブ用です。インタラクティブのみで必要なところに/* for interactive */をつけました。入出力するときにstderrにログを載せるようにすることで、ログファイルを生成するようにしました。本当はログファイル生成もatcoder-toolsでできればきれいですが、それが難しい(仲介スクリプトの作り方がわからない)ので、こうなっています。
したがって、現状ではインタラクティブ問題ではinput, output関数を通して入出力してほしいです。
from atcoder-tools.
なるほど。inputとoutputをデフォとして使わせるのはちょっと場当たり的な対処な感じがして、公式ではサポートしたくないやり方ですね...(本当にデバッグ出力したい人は手動で出すくらいにしてほしい)
from atcoder-tools.
どっちにしてもjudgeコードのジャッジメッセージ(なぜ間違えたかなど)をどこかに残してそれを読むというのをやりたいのですが、標準出力しちゃうと./mainの方に渡っちゃうので、標準エラー出力か新たにログファイルを作るかまたは標準出力をそのまま./mainに渡さないで解析するとかしないといけないのです。。。
from atcoder-tools.
わざわざ公式が提供しなくてもユーザーが標準エラー出力を自分で書くとかで十分な気がしますね
from atcoder-tools.
Related Issues (20)
- python でのsubmit時のlanguage_number取得時のerror
- submit時のsave_no_session_cacheが逆になっている
- Merge remaining pending changes to be released branched from 1.1.5
- TLE になるケースをテストするとクラッシュする
- 開発フローを明らかにして極力自動化する + Python3.5サポート廃止
- genコマンドでコード生成する際、ファイルがすでにある場合にスキップするオプションが欲しい HOT 3
- 対応言語を自動でREADMEに反映
- Universal code generatorのテンプレートを指定したい HOT 4
- atcoder-tools loginが欲しい
- test や submit の --dir に相対パスを指定すると実行ファイルの実行に失敗する
- submitコマンドが終了コード255で終了する
- input_part_prefixが使われていない
- submit コマンドにも lang オプションが欲しい HOT 3
- Go言語でatcoder-tools testを実行するとエラーで失敗する
- "soft_unicode" is not supported in latest markupsafe HOT 2
- Tampemonkey用Userscriptのリンク切れ
- gen コマンドでコンテストの指定にURLを使えるようにする
- 言語アップデートでの提出の表記が変わった HOT 2
- submitコマンド実行終了時、提出結果ページをブラウザで開く HOT 1
- atcoderのサイトではacになるコードが"atcoder-tools test" で通らないです。
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from atcoder-tools.