class Contest::Driver::AizuOnlineJudgeDriver
Public Instance Methods
get_desc()
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 39 def get_desc "Aizu Online Judge (URL: http://judge.u-aizu.ac.jp)" end
get_opts_ext()
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 20 def get_opts_ext define_options do opt( :problem_id, "Problem ID (Ex: 1000, 123, 0123, etc...)", :type => :string, :required => true, ) end end
get_problem_id(options)
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 35 def get_problem_id(options) "#{options[:problem_id]}" end
get_site_name()
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 31 def get_site_name "AOJ" end
initialize_ext()
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 14 def initialize_ext @client = Mechanize.new {|agent| agent.user_agent_alias = 'Windows IE 7' } end
resolve_language(label)
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 43 def resolve_language(label) case label when "clang" return "C" when "cpp" return "C++" when "java" return "JAVA" when "cpp11" return "C++11" when "cs" return "C#" when "dlang" return "D" when "ruby" return "Ruby" when "python2" return "Python" when "python3" return "Python3" when "php" return "PHP" when "javascript" return "JavaScript" else abort "unknown language" end end
submit_ext()
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 72 def submit_ext # start trigger 'start' problem_id = normalize_problem_id(@options[:problem_id]) # submit trigger 'before_submit', @options submit_page = @client.get "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0000" submit_page.parser.encoding = "SHIFT_JIS" res_page = submit_page.form_with(:action => '/onlinejudge/servlet/Submit') do |form| form.userID = @config["user"] form.password = @config["password"] form.problemNO = problem_id form.language = @options[:language] form.sourceCode = File.read(@options[:source]) end.submit trigger 'after_submit' # need to get the newest waiting submissionId trigger 'before_wait' status_page = @client.get "http://judge.u-aizu.ac.jp/onlinejudge/status.jsp" submission_id = get_submission_id status_page.body # wait result status = get_status_wait @config["user"], submission_id trigger( 'after_wait', { :submission_id => submission_id, :status => status, :result => get_commit_message(status), } ) trigger 'finish' get_commit_message(status) end
Private Instance Methods
get_status(submission_id, body)
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 145 def get_status(submission_id, body) doc = REXML::Document.new body status_loop(doc) do |run_id, status| return status if run_id == submission_id end return '' end
get_status_wait(user_id, submission_id)
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 116 def get_status_wait(user_id, submission_id) # wait result 5.times do sleep 3 status_page = @client.get "http://judge.u-aizu.ac.jp/onlinejudge/webservice/status_log?user_id=#{user_id}&limit=1" status = get_status(submission_id, status_page.body) return status unless is_waiting(submission_id, status_page.body) trigger 'retry' end trigger 'timeout' return 'request timed out' end
get_submission_id(body)
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 153 def get_submission_id(body) doc = Nokogiri::HTML body doc.xpath('//table[@id="tableRanking"]//tr[@class="dat"]')[0].search('td')[0].text.strip end
is_waiting(submission_id, body)
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 137 def is_waiting(submission_id, body) doc = REXML::Document.new body status_loop(doc) do |run_id| return false if run_id == submission_id end return true end
normalize_problem_id(problem_id)
click to toggle source
180 -> 0180
# File lib/contest/driver/aizu_online_judge_driver.rb, line 112 def normalize_problem_id(problem_id) "%04d" % problem_id.to_i end
status_loop(doc) { |run_id, status| ... }
click to toggle source
# File lib/contest/driver/aizu_online_judge_driver.rb, line 129 def status_loop(doc) doc.root.elements['//status_list'].elements.each('status') do |elm| run_id = elm.elements['run_id'].text.to_s.strip status = elm.elements['status'].text.to_s.strip yield run_id, status end end