AtCoder でファイルを読み書きするのが何かに違反するか

更新日時:

疑問形にしたけど、答えが見つからなかった。

経緯

KUPC2017

KUPC2017 の G - encode/decode 2017 の「自明な解法」に、次のようなものがある。

  • encode フェーズで、受け取った整数を書き込んだファイルを作成する。
  • decode フェーズで、そのファイルを読み込み、その整数を出力する。

もちろんこの解法が、この問題の趣旨を蹂躙しているのは明白である。 しかし、現実にはこれで通ってしまったと、解説に書かれている。

コンテスタントの気持ちとしては

こんなので正解→得点加算するのは間違っていると思う。加点も問題だが、問題を解くのに本来かかる時間をスキップできているのが痛すぎる。

私はこの問題を正解できたが、正解するのに 2 時間半ほど実装している。この時間を、この「解法」でスキップできるなら他の問題も得点できた可能性もある。

どうなったか

KUPC2017 東京オンサイトにいたのだが、その場で解説を聞いた限り、ジャッジ陣はこの「解法」を弾かなかったようである。「AtCoder 社に問い合わせています」とは話していた。

ところが Twitter で検索したところ、 chokudai 社長がこの解法を手動で弾いていることが判明した。

ツイートを見ると、実際に弾いている様子が確認できた。(晒して悪いとは思うけどツイートは公開されているので引用します)

実際 404 で非公開になっている。

そして、これを非表示にできる根拠として、以下のようにツイートがなされていた。

どうやら、 システムの方で一律に読み書き禁止するのは難しいから、発見し次第手動で弾く しか有効な手段がないと読み取れる。

根拠を探してみる

ファイルを読み書きしてはならないのはなぜなのか? その根拠を探したい。根拠がないなら、非表示するのも不適当であるからだ。

利用規約

AtCoder 利用規約 を読んだが、ファイルの読み書きが禁止されているとは書いていなかった。利用規約というのは総則に当たるものだから、各論はないのは当然であろう。

コンテストという性質上、「何かをするのはいいですよ」とは言いづらい。「禁止されていないことはやって良い」であろう。だから今回の件は禁止事項と関係があろう。以下に引用する。

禁止事項

  1. 本サービスの利用に当たって、以下の行為又はそのおそれがある行為を行ってはならないものとします
    1. 公序良俗に反する行為
    2. 国内法に抵触する行為
    3. 特定または不特定の第三者に著しい不利益をもたらす行為
    4. 当サービスに虚偽の情報を申請すること
    5. 当サービス、弊社に損害を与える・与える恐れのある行為をすること
    6. 複数人によるログインIDの共有行為
    7. その他、弊社が不適切と判断する行為
  2. 弊社はユーザが上記の事項に該当した場合、その該当ユーザの同意を得ずに退会処理を行うことができるものとします

該当しそうなものは「3.特定または不特定の第三者に著しい不利益をもたらす行為」「5.当サービス、弊社に損害を与える・与える恐れのある行為をすること」「7.その他、弊社が不適切と判断する行為」だろうか。7.は最終手段だから、事後に非表示にされるという観点から、公平性という意味ではどうなのか。だからこれではなかろう。

次に、3.は、確かにこの解法を使うと短時間で楽に加点されるという意味では、他のコンテスタントに迷惑はかかっているように思う。しかし「著しい不利益」なのかと言われるとそうでもなかろう。賞金もレートもかかっていないコンテストで、上に行かれた分、順位が下がるだけ。これは該当しなさそうである。

だから残るは、5.しかない。chokudai 社長も「2回実行型ジャッジに対する既知の 攻撃 」と言っている。意図的な一時ファイルの作成は、サーバには「多少の負担」がかかっているのは間違いがない。「損害を与える行為」とは言えるかもしれない。また、運営が意図しない一時ファイルの故意の作成は、サーバのセキュリティ上問題が残る。これを悪用すればハックが可能かもしれない。そういう意味では「損害を与える恐れのある行為」とも言えるかもしれない。

しかしこれも議論の余地が残る。今回の場合、 1 テストケースにつき 64 bit 整数が 1 つだけ書かれたファイルを作成して読み込むだけである。これがサーバの負担になることは、現在の計算機の性能を鑑みるとありえない。「損害を与える行為」ではないことになる。また、今回一時ファイルの読み書きをする目的は、問題を解くことであるのは明白であり、「悪用すればハックが可能」だからと言って「損害を与える恐れのある行為」というのは話が飛躍している。

結局のところ

これだと思っていいのかな。

しかし 「一時ファイルを読み書きして良いか」というのが「意図的な問題破壊」か「楽しい活用の範囲」かに依存するのは、コンテスタントにとっては明瞭でない ように思う。

コンテスタントが AtCoder で、一時ファイルを読み書きすることを選択しようと思う場合、それが有利だから、あるいは実装が簡単になるから、あるいは問題が簡単になるから、脳裏によぎる。しかし普通に考えて、ライターやテスターやジャッジは、一時ファイルの読み書きを想定していないはずである。この意味で、 ほとんど全ての一時ファイルの読み書きは「意図的な問題破壊」の範囲に入ってしまう と、少なくとも私には思われる。

こういう認識を持っているコンテスタントは私だけではなかろう。そういう人は自制するはず。しかしそれでも、少しでも高い順位を目指したいと思うと、一時ファイルの読み書きをして正答できる問題がそこにあれば、やってしまうかもしれない。また、「楽しい活用の範囲」と理解し、自制しない人もいるはずである。この人たちとは問題の難易度に差が出ることとなる。

だから、一時ファイルの読み書きをなるべく「楽しい活用の範囲」と理解しておくと、得点が稼げることとなる。しかし今回のように、場合によってはジャッジによって消される可能性がある。ジャッジにはジャッジの「意図的な問題破壊」か「楽しい活用の範囲」の線引きがあるから、その線引きより手前に引いていればセーフ、そうでなければアウト、ということになる。 ジャッジとのシンクロ度を競う恣意的な基準 のように思われる。

だから「ファイル書き込みを制限すると一部の言語が死にます」というならば、せめて「提出されたコードの中で、一時ファイルを作成したり、一時ファイルを読み込んだりする命令を書いてはなりません」ということにして、どこかで明示した方がいい と思う。

私はあらゆる言語に通じているわけではないため、今書いた文言ではよくないかもしれない。言語によっては、「読み書きの命令ではないが、読み書きできてしまう抜け穴」があるかもしれない。逆に、「この命令は一時ファイルを作成するのが目的の命令ではないが、処理系が勝手に一時ファイルを作成するから、この文言だと引っかかる」という場合もあるだろう。文言は練らねばならない。

しかしこういう趣旨のことを改めて書いておかないと、今回のようなことも起こる。 何より、基準が曖昧なまま使って良いことにしてしまうと、一時ファイルを使って通った人、通ったけど非表示にされた人、一時ファイルを使うのが問題を蹂躙していると判断し使わなかった人、どの立場の人も不幸になってしまう。 だから、全部禁止として、それを明示するのが明快だと思う。

このことがコンテストの幅を狭めるとも思えない。そもそもライターやテスターやジャッジは、一時ファイルの読み書きを想定していないのだから、ファイルの読み書き命令を禁止されても「誰も困らない」はずである。万が一、ファイルの読み書きをあえて使用させる問題を作った場合は、問題文で明白に「この問題はファイルの読み書きを許可する。この問題は禁止事項の例外とする。」と宣言すれば曖昧さが生じないだろう。

追伸

私はライターにもテスターにもジャッジにもなったことがないので、どういうことが言われたのかきになる。

コメントする