Yuulis.log

Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

【AtCoder】atcoder-cliの acc submit で assert parsed_memory_limit エラーが発生する原因と対処法

手っ取り早く対処法を知りたい人は、以下の目次から「対処法(応急処置)」のリンクをクリックすること。

はじめに

AtCoderのコンテストに参加する際、私は以前に紹介したVScode上のローカルコーディング環境を使用している。テストケースの取得から提出までがエディタ上で完結するという大変便利なもので、とても気に入っている。

yuulis.hatenablog.com

さて、先日開催された AtCoder Beginner Contest 408においても、いつものように atocder-cli を通じてacc submitコマンドを叩き、コードを提出しようとした。

しかし、ここで見慣れないエラーが発生。

なんだこれ

本番中は、とりあえずコードをコピペして問題ページにペーストして提出することで事なきを得たが、普通に面倒なので修正したい。

エラーの原因

atcoder-cliacc submitコマンドは、内部で online-judge-tools のoj submitコマンドを呼び出しており、今回はこのoj submitコマンドの動作が問題となっている。だからエラー文にもonline-judge-toolsのファイル群が表示されている。

エラー文のTracebackの最後を見ると、このように書かれている。

File "/home/yuulis/.pyenv/versions/3.10.14/lib/python3.10/site-packages/onlinejudge/service/atcoder.py", line 582, in _from_html
    assert parsed_memory_limit

どうやらonlinejudge/service/atcoder.pyファイルの582行目付近が悪さをしているようだ。

ということで該当の箇所を見てみる。

この部分の処理は、コンテストの問題ページ上部の「メモリ制限: ~」という部分を取得するものである。このコードでは、正規表現で KB あるいは MB 単位が指定されている。

しかし、実はABC408が開催された時点より、全ての問題のメモリ制限の単位が KB / MB から KiB / MiB に変更されているのだ。まじで気づかなかった...

ちなみに、KB が  10^3 バイトと  2^{10} バイトのどちらの意味にもなり得るのに対して、 KiB は正確に  2^{10} バイトを指すらしい。


ということで、onlinejudge/service/atcoder.pyファイル上でKBMBとなっている部分を修正していけば良さそうである。

対処法(応急処置)

では、このエラーの対処法を以下に示す。ただし、この修正はあくまで応急処置的なものであることに留意してほしい。

エラーが起きている該当のファイルを開く

VSCodeでは、ターミナル上でファイルパスにマウスをホバーすれば、「Ctrl + クリック」でそのファイルを開くことができる。

もしくは、以下のファイルを直接開く(冒頭に示した私の環境構築記事に従っている場合)。

"~/.pyenv/versions/3.10.14/lib/python3.10/site-packages/onlinejudge/service/atcoder.py"

2. メモリ単位表記の修正

  • 581行目 :
# When login as the admin, a link is added after memory limit. See https://github.com/online-judge-tools/api-client/issues/90
+ parsed_memory_limit = re.search(r'^(メモリ制限|Memory Limit): ([0-9.]+) (KiB|MiB)', memory_limit)
- parsed_memory_limit = re.search(r'^(メモリ制限|Memory Limit): ([0-9.]+) (KB|MB)', memory_limit)
assert parsed_memory_limit
  • 586, 588行目 :
memory_limit_value = parsed_memory_limit.group(2)
memory_limit_unit = parsed_memory_limit.group(3)
+ if memory_limit_unit == 'KiB':
- if memory_limit_unit == 'KB':
    memory_limit_byte = int(float(memory_limit_value) * 1000)
+ elif memory_limit_unit == 'MiB':
- elif memory_limit_unit == 'MB':
    memory_limit_byte = int(float(memory_limit_value) * 1000 * 1000)
else:
    assert False

とりあえずこの部分だけ修正すれば、acc submitコマンドは通るはずである。

おわりに

今回紹介したエラーは、 online-judge-tools の Github の Issues 及び Pull requests に既に持ち上がっているようだ。

github.com

github.com

早期の正式な修正を期待している。


ということで、今回はここまで。

参考記事

  • atcoder-cliについて : tatamo.81.la

  • 参考ツイート :