Topcoder SRM結果取得プログラム
Topcoderで公開されてるデータ群を使って,指定したハンドル名とSRMの番号を入力にして結果を出力するプログラム書いた.ただ,返ってくるXMLファイルがでかいので若干遅い.「Algorithm Rating History」の方でもいいけどこれはレーティングの変化だけしか取得できないのでどれが解けてチャレンジでどれくらい点数がとれたかを取得したかったので「Algorithm Round Results」から取得している.
※追記 SRMの番号を省略すると最新のSRMの結果を出力するよう変更
使用DataFeeds:http://www.topcoder.com/wiki/display/tc/Algorithm+Data+Feeds
「Algorithm Round List」
「Algorithm Round Results」
出力結果
>python srmResultGetter.py nise_nabe 491 nise_nabe Member SRM 491 ○ ○ × 0.0 = 445.42 pts 1050 -> 1095
コード
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import urllib2 from xml.dom.minidom import parseString def ox(resultText): return u'○' if resultText == 'Passed System Test' else u'×' def getData(row, tagName, text=''): cnode = row.getElementsByTagName(tagName)[0].childNodes return cnode[0].data if len(cnode) > 0 else text argv = sys.argv argc = len(argv) if argc < 2: print 'usage: python %s handle [srmNumber]' % argv[0] quit() name = argv[1] srm = argv[2] if argc > 2 else '' # print name f = urllib2.urlopen("http://www.topcoder.com/tc?module=BasicData&c=dd_round_list") dom = parseString(f.read()) roundId = '' roundName = '' if srm == '': row = dom.getElementsByTagName('row')[-1] roundId = getData(row, 'round_id') roundName = getData(row, 'short_name') else: for row in dom.getElementsByTagName('row'): roundName = getData(row, 'short_name') if srm in roundName: roundId = getData(row, 'round_id') break if roundId == '': print 'invalid srm number' quit() roundDataUrl = 'http://www.topcoder.com/tc?module=BasicData&c=dd_round_results&rd='+roundId # print roundDataUrl f = urllib2.urlopen(roundDataUrl) dom = parseString(f.read()) for row in dom.getElementsByTagName('row'): handle = getData(row, 'handle') if handle == name: print name, roundName print ox(getData(row, 'level_one_status')), print ox(getData(row, 'level_two_status')), print ox(getData(row, 'level_three_status')), print getData(row, 'challenge_points'),'=', print getData(row, 'final_points'),'pts', print print getData(row,'old_rating'), print '->', print getData(row, 'new_rating'), print break