AtCoder 自動提出機 正規版から beta へ移行する際にしたこと

更新日時:

自分でタイトルを書いていて頭おかしいと思った。正規版から beta 版へ移行するとはどういうこと。しかしもう AtCoder としては「正規版がダメなら beta 版で。 beta 版が動いているならそれでいいじゃない」という姿勢らしい。

こうなっては仕方がない。 beta 版こそが正規版だとみなして 、 beta 版に直していくしかない。 Selenium で自動提出する Ruby スクリプトも書き直さないといけないので、書き直しました。どこを主に変更するかをメモしておきます。

変更点

Assignments について

まず assignments ではなく tasks になっている。 assignments もリダイレクトになる。

  • コンテスト名は find_element(:class, "contest-name") から find_element(:class, "contest-title") で取得に変更。
  • コンテスト時間は find_elements(:class, "timezone-fixed") から find_elements(:class, "fixtime-full") で取得に変更。
  • table の tbody/tr たちは xpath でいうと //*[@id="main-container"]/div/div[2]/div/table/tbody/tr に変更になっている。
    • 中身は同様のメソッドで大丈夫

各問題ページについて

全く同じスクリプトで動いた。 elements = @driver.find_elements(:class, "part") として

elements.each{|elem|
  h3 = elem.find_elements(:tag_name, "h3")
  pre = elem.find_elements(:tag_name, "pre")
  # あと適当に
}

とする方法で問題なかった。ゆえに変更点なし。

submit について

まず問題選択。 find_element(:id, 'submit-task-selector') から find_element(:id, "select-task") と変更する。言語選択は find_element(:class, 'submit-language-selector') がわかりやすかったが、 beta では find_element(:xpath, "//*[@id=\"select-lang-#{url_last}\"]/select") のようにする。ここで url_last は “arc099_a” のようなやつ。問題を選択すると言語選択が displayed になるので wait.until で待つ。

ソースコード入力は、結論からいうと、以前と同様に入力欄に copy and paste する方法が安定だと思う。ファイルを直接読み込むやつは input type=”file” ではないので、 send_keys(path) する方法では不可能なようだ。

find_element(:name, 'source_code') から find_element(:name, 'sourceCode') に変更するのは当然であるが、ここで普通に send_keys(:shift, :insert) とすると visible でないとか文句を言われる。どうもデフォルトのエディタがかっこいい高機能行数つき色分けエディタであるのが問題らしい。「エディタ切り替え」のボタンを押した状態だと、普通にプレインな状態にでき、当然 visible になる。「エディタ切り替え」ボタンはオン・オフを向こう側で保存しているようなので、例えば以下のようにすればどちらにも対応できる。

source = @driver.find_element(:name, 'sourceCode')
if !source.displayed?
  @driver.find_element(:xpath, '//*[@id="main-container"]/div/div[2]/form/div[3]/div[2]/p[2]/button').click
  @wait.until {
    source.displayed?
  }
end

あとは細かい調整をした。

追加点

AtCoder の正規版と beta 版が両方攻撃された場合に備えて、両方の問題文の情報をローカルで持つことにした。スクショと html で保存してある。

html の保存

page_source を write するだけ。

スクリーンショット

以下のページを参考にした。

width 方向へは必要ない。ほぼ同じ。上のヘッダと下のタイマーは jQuery で hide することにした。最初は上のヘッダの分だけ crop していた。

@driver.execute_script('$(".contest-timer").hide()')
@driver.execute_script('$(".navbar").hide()')

自分で対策ができない点

それでも submit のところは、ローカルではどうしようもない。

仮に両方攻撃されてどちらも満足に submit できないとなったら、さすがにもうコンテストとしてダメだと思う。そういう状態になっても「みんなが同じ障害を受けていて(みんな等しく不幸になっているから) rated である」と同じことをいうのであれば、もうそれはプログラミングコンテストであるどころか「競技」ではない「何か」であると断じる他ない。仮にそうなったら AtCoder でリアルタイムでコンテストに出場するのはやめることにする。

コメントする