概要
タイトルの通りです。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編
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/