SFLSPCへようこそ!
背景
南極ペンギン語学校(Antarctica Penguin Language School)では、ペンギンたちが毎年、コードの短縮や最適化の訓練を行っています。
北極海ホッキョクグマ語学校から派遣されたスパイのペンギンが一人紛れ込んでいます!そいつは大会に潜入し、APLSをホッキョクグマの植民地にしようと企んでいます!
勤勉で勇敢な一羽のペンギンが、邪悪な北極ペンギンの転覆計画を阻止しただけでなく、APLSPCのすべてのデータを作成しました。さあ、ペンギンに感謝しましょう。
偉大なペンギンが一羽います。それは非常に偉大で、南極ペンギン語学校の皇帝です。
ドゥドゥというペンギンが一羽います。とてもドゥドゥしています。それはドゥドゥドゥ大学習をあなたに送り、学習するように要求しました。
糖糖というペンギンが一羽います。そのペンギンが書いた $O(n\log n)$ のコードが、$n\le 5\times 10^5$、2秒というデータ範囲に収まらず、激怒して社会への復讐を決意し、この問題を作成しました。
問題文
以下の条件を満たすコードを作成してください。
- 指定された言語のコンパイルコマンドで正常に実行され、自身のソースコードを出力すること。
- 全単語マッチング(Full-word matching)の定義において、その言語のキーワードを一切含まないこと(全単語マッチングについては「評価の詳細」を参照)。
これらの条件はC++とPythonの両方で満たさなければなりません。つまり、このコードはC++としてもPythonとしても合法であり、かつ上記の条件を満たす必要があります。
その上で、コードを可能な限り短くしてください。
コードがすべての条件を満たし、かつ長さが250B以下であれば、100点を獲得できます。一部の条件を満たさない場合でも、一定の点数が得られます。詳細は「採点方法」を参照してください。
注意:実行環境のディレクトリにはソースコードが存在しないように処理されます。ソースコードファイルを読み込むような手法は使用できませんし、使用すべきではありません。
文法に詳しくない場合は、python.org または cppreference.com を参照してください。
評価の詳細
コードにはASCII文字以外を含めてはなりません。含めた場合、結果は未定義となります。
まず、コード内のすべての改行は強制的にCRLF(\r\n)に変換されるため、1つの改行は2バイトを占有します。
次に、ジャッジシステムは以下のコマンドでコードを実行します。
/usr/bin/g++ code.cpp -std=c++2a -O2 -o code && ./code
python3 code.cpp
その後、ジャッジシステムは以下のコマンドを使用して、コードが自身を出力したかどうかを判定します。
diff --strip-trailing-cr code.cpp out
このコマンドは行末のCRLFをLFとして扱うため、出力時に特殊な改行コードを気にする必要はありません。
それ以外については、完全に厳密な比較が行われます。つまり、行末のスペースなどの空白文字も完全に一致している必要があります。
最後に、ジャッジシステムはキーワードリストからコード内にキーワードが含まれているかを検索します。検索方法は全単語マッチングです。全単語マッチングの定義は、マッチした位置の前後が数字、アルファベット、またはアンダースコアではないことです。例えば int は (int) にマッチしますが、print にはマッチしません。キーワードリストは問題の最後に記載されています。
特に注意すべき点として、設定されている制限時間は無意味であり、実際の制限時間は1000msです。コードの実行時間が1000msを超えると強制終了されますが、実行時間やメモリ使用量は評価結果には反映されません。
採点方法
初期スコア $s_0$ を以下のように定義します。
コードがキーワードを含むかどうかにかかわらず、C++として合法であり、C++での実行時に自身を出力したが、Pythonとして合法ではない場合、$s_0=2$。
コードがキーワードを含むかどうかにかかわらず、C++およびPythonとして同時に合法であり、C++での実行時に自身を出力したが、Pythonでは出力しなかった場合、$s_0=10$。
コードがキーワードを含むかどうかにかかわらず、C++およびPythonとして同時に合法であり、両方の言語で自身を出力した場合、コードの長さを $x$ として、
$$ s_0=f(x)= \begin{cases} 20&(x\ge10^4)\\ 45-\frac{x}{400}&(2000\le x<10^4)\\ \frac{200}{3}-\frac{x}{75}&(500\le x<2000)\\ 135-\frac{3x}{20}&(300\le x<500)\\ 150-\frac{x}{5}&(x<300) \end{cases} $$
- それ以外の場合、$s_0=0$。
$f(x)$ は連続関数です。$s_0$ は100を超える可能性があることに注意してください。
最終的に、コードにキーワードが含まれていない場合は $\lfloor\min(100,s_0)\rfloor$ 点、含まれている場合は $\lfloor\min(70,0.7s_0)\rfloor$ 点となります。
キーワードリスト
C++のキーワードリスト:
{
"alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break",
"case", "catch", "char", "char8_t", "char16_t", "char32_t", "class", "compl", "concept",
"const", "consteval", "constexpr", "constinit", "const_cast", "continue", "co_await",
"co_return", "co_yield", "decltype", "default", "delete", "do", "double", "dynamic_cast",
"else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend", "goto",
"if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq",
"nullptr", "operator", "or", "or_eq", "private", "protected", "public", "register",
"reinterpret_cast", "requires", "return", "short", "signed", "sizeof", "static",
"static_assert", "static_cast", "struct", "switch", "synchronized", "template", "this",
"thread_local", "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned",
"using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq"
}
Pythonのキーワードリスト:
{
"False", "None", "True", "and", "as", "assert", "async", "await", "break", "class",
"continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global",
"if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", "raise", "return",
"try", "while", "with", "yield", "match", "case"
}
ヒント
- C++の
main関数は戻り値の型を定義しなくても構いません。つまり、以下のコードは合法なC++コードです。
main(){}
入出力例
入力 1
(入力データなし)
出力 1
(ソースコード自身)