class Contest::Driver::UvaOnlineJudgeDriver

Public Instance Methods

get_desc() click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 38
def get_desc
  "UVa Online Judge (URL: http://uva.onlinejudge.org/)"
end
get_opts_ext() click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 19
def get_opts_ext
  define_options do
    opt(
      :problem_id,
      "Problem ID (Ex: 100, 200, etc...)",
      :type => :string,
      :required => true,
    )
  end
end
get_problem_id(options) click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 30
def get_problem_id(options)
  "#{options[:problem_id]}"
end
get_site_name() click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 34
def get_site_name
  "UVa"
end
get_status_wait(submission_id) click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 107
def get_status_wait(submission_id)
  submission_id = submission_id.to_s
  # wait result
  12.times do
    sleep 10
    my_page = @client.get 'http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=9'
    status = get_submission_status(submission_id, my_page.body)
    return status unless is_wait_status status
    trigger 'retry'
  end
  trigger 'timeout'
  return 'timeout'
end
get_submission_id(body) click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 121
def get_submission_id(body)
  doc = Nokogiri::HTML(body)
  text = doc.xpath('//div[@class="message"]')[0].text().strip
  text.match(/Submission received with ID ([0-9]+)/)[1]
end
get_submission_status(submission_id, body) click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 127
def get_submission_status(submission_id, body)
  doc = Nokogiri::HTML(body)
  doc.xpath('//tr[@class="sectiontableheader"]/following-sibling::node()').search('tr').each do |elm|
    td_list = elm.search('td')
    item_submission_id = td_list[0].text.strip
    if item_submission_id == submission_id
      item_problem_id = td_list[1].text.strip
      item_status = td_list[3].text.strip
      return item_status
    end
  end
  'timeout'
end
initialize_ext() click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 13
def initialize_ext
  @client = Mechanize.new {|agent|
    agent.user_agent_alias = 'Windows IE 7'
  }
end
is_wait_status(status) click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 98
def is_wait_status(status)
  case status
  when "Sent to judge", "Running", "Compiling", "Linking", "Received", ""
    true
  else
    false
  end
end
resolve_language(label) click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 42
def resolve_language(label)
  case label
  when "c"
    return "1"
  when "cpp"
    return "3"
  when "cpp11"
    return "5"
  when "java"
    return "2"
  when "pascal"
    return "4"
  else
    abort "unknown language"
  end
end
submit_ext() click to toggle source
# File lib/contest/driver/uva_online_judge_driver.rb, line 59
def submit_ext
  trigger 'start'
  problem_id = @options[:problem_id]

  # submit
  trigger 'before_login'
  login_page = @client.get 'http://uva.onlinejudge.org/'
  login_page.form_with(:id => 'mod_loginform') do |form|
    form.username = @config["user"]
    form.passwd = @config["password"]
  end.submit
  trigger 'after_login'

  trigger 'before_submit', @options
  submit_page = @client.get 'http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=25'
  res_page = submit_page.form_with(:action => 'index.php?option=com_onlinejudge&Itemid=25&page=save_submission') do |form|
    form.localid = problem_id
    form.radiobutton_with(:name => 'language', :value => @options[:language]).check
    form.code = File.read(@options[:source])
  end.submit
  trigger 'after_submit'

  # <div class="message">Submission received with ID 12499981</div>
  trigger 'before_wait'
  submission_id = get_submission_id(res_page.body)
  status = get_status_wait(submission_id)
  trigger(
    'after_wait',
    {
      :submission_id => submission_id,
      :status => status,
      :result => get_commit_message(status),
    }
  )

  trigger 'finish'
  get_commit_message(status)
end