class OJS::AtCoder

Public Class Methods

contest_id() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 67
def contest_id
  unless @config['contest_id']
    @config['contest_id'] = Dir.pwd.split('/').last
  end
  @config['contest_id'].downcase
end
contest_url() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 34
def contest_url
  "#{contest_id}.contest.atcoder.jp"
end
language() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 42
def language
  set_extra_values unless @languages
  cands = []
  @languages.each do |id, name|
    cands << [id,name] if name.downcase.match Regexp.escape(@config['language'].downcase)
  end
  raise Judge::UnknownLanguageError if cands.empty?
  return cands[0][0] if cands.size == 1
  select_language cands
end
login() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 7
def login
  res = hclient.post(
    "https://#{contest_url}/login",
    { name:     user,
      password: password,
      submit:   'Login' }
  )
  hclient.cookies.each do |ck|
    ck.domain = contest_url if ck.domain == 'atcoder.jp'
  end
  raise Judge::LoginFailedError unless hclient.cookies.any? { |ck| ck.name == '_user_id' }
  Logger.info "Logged in successfully."
end
post() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 21
def post
  res = hclient.post(
    "https://#{contest_url}/submit",
    { __session:   session,
      task_id:     task_id,
      :"language_id_#{task_id}" => language,
      source_code: code,
      submit:      'submit',
    }
  )
  raise Judge::SubmissionError if res.body =~ /Error/
end
problem_id() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 81
def problem_id
  unless @config['problem_id']
    @config['problem_id'] = File.basename(file).split('.')[0]
  end
  @config['problem_id'].upcase
end
select_language(cands) click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 53
def select_language(cands)
  Logger.info "Two or more languages are matched. Please select one."
  cands.each_with_index do |cand, idx|
    Logger.info "#{idx} : #{cand[1]}"
  end
  while true
    inp = STDIN.gets.chomp
    next Logger.info "Please input number." unless inp =~ /\A\d+\z/
    idx = inp.to_i
    next Logger.info "Please input valid number." unless cands[idx]
    return cands[idx][0]
  end
end
session() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 88
def session
  unless @session
    set_extra_values
  end
  @session
end
set_extra_values() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 95
def set_extra_values
  res = @hclient.get("https://#{contest_url}/submit")
  html = Nokogiri::HTML.parse(res.body)
  @session = html.xpath('//input[@name="__session"]/@value').first.value
  @task_id = html.xpath('//select[@name="task_id"]/option').first.attribute('value').value.to_i + problem_id.ord - 'A'.ord
  @languages = html.xpath("//select[@name=\"language_id_#{@task_id}\"]/option").map { |lang|
    [lang.attribute('value').value, lang.content]
  }
end
status_url() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 38
def status_url
  "https://#{contest_url}/submissions/me"
end
task_id() click to toggle source
# File lib/ojsubmitter/judge/atcoder.rb, line 74
def task_id
  unless @task_id
    set_extra_values
  end
  @task_id
end