LoginSignup
12
14

More than 5 years have passed since last update.

AtCoderで特定ユーザが投稿したコードを検索するプログラムを作ってみた

Posted at

概要

 タイトルの通りです。Ruby版の実装は私が作りましたが、その後に他の方がJavaScriptで実装してくれました。
 AtCoderが何かについては詳細を略しますが、「競技プログラミングサイトの1つ」ぐらいの認識でオーケーです。

アルゴリズム

 AtCoderでは、自分や他人が投稿したコードを閲覧することができます。この閲覧はログインしなくても可能ですので、自分が書いたコードを他人に見せたい場合にはとても便利ですね。逆に、自分より上手い人のコードを眺めたい場合にも対応しています(サイトのフォーム上で条件を指定して検索できる)。
 ここで、ある人から、「ある特定のユーザが投稿したコードの一覧を出せないか(要約)」との声が出ました。で、その応対を眺めていますと、どうやらgetパラメータによって検索結果が制御されているようです。具体的には次の通り。

http://abc003.contest.atcoder.jp/submissions/all
……AtCoder Beginner Contest(以下ABC)003における全ての一覧
http://abc003.contest.atcoder.jp/submissions/all?user_screen_name=YSR
……ABC003におけるYSR氏が投稿した一覧
http://abc003.contest.atcoder.jp/submissions/all/2?user_screen_name=YSR
……ABC003におけるYSR氏が投稿した一覧(2ページ目)

 ということは、当該URLを叩きつつ、中身のHTMLを解析すればお手軽に一覧が作れるはずです。構造がシンプルでしたので、解析はそれほど難しくありませんでした。

Ruby編

search.rb
require 'open-uri'
require 'nokogiri'

user = 'YSR' #検索したいユーザ名

1.upto(31){|i|
    url = 'http://abc' + sprintf('%03d', i) + '.contest.atcoder.jp/submissions/all?user_screen_name=' + user
    charset = nil
    html = open(url) do |f|
        charset = f.charset
        f.read
    end
    doc = Nokogiri::HTML.parse(html, nil, charset)
    nodes = doc.css('table[class="table table-bordered table-striped table-wb"] > tbody > tr')
    next if nodes.size == 0
    puts 'AtCoder Beginner Contest ' + sprintf('%03d', i)
    nodes.each{|node|
        print node.css('td > a')[0].inner_text + "\t"
        print node.css('td.table-nwb')[1].inner_text + "\t"
        print node.css('td > span').inner_text + "\t"
        puts 'http://abc' + sprintf('%03d', i) + '.contest.atcoder.jp' + node.css('td > a')[3].attribute('href').value
    }
}

 これを実行すると、次のように結果が表示されます。

AtCoder Beginner Contest 003
B - AtCoderトランプ Ruby (1.9.3) AC http://abc003.contest.atcoder.jp/submissions/604223
B - AtCoderトランプ C++11 (GCC 4.8.1) AC http://abc003.contest.atcoder.jp/submissions/604215
B - AtCoderトランプ C++11 (GCC 4.8.1) AC http://abc003.contest.atcoder.jp/submissions/604213
(中略)
C - Brute-force Attack C++ (GCC 4.9.2) AC http://abc029.contest.atcoder.jp/submissions/497685
A - 複数形 C++ (GCC 4.9.2) MLE http://abc029.contest.atcoder.jp/submissions/497668
B - カキ C++ (GCC 4.9.2) AC http://abc029.contest.atcoder.jp/submissions/497381
A - 複数形 C++ (GCC 4.9.2) AC http://abc029.contest.atcoder.jp/submissions/496972

JavaScript編

 リンク先のページをご覧ください。
Wreulicke氏が作成した版→
 http://jsfiddle.net/m8um5tpx/1/
 http://jsfiddle.net/m8um5tpx/6/
angel-p57氏が作成した版→
 http://jsfiddle.net/88csv9t5/1/

12
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
14