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