Show More
Commit Description:
Update README.rdoc
Commit Description:
Update README.rdoc
References:
File last commit:
Show/Diff file:
Action:
script/score_subtask.rb
| 89 lines
| 2.2 KiB
| text/x-ruby
| RubyLexer
|
r813 | def display_manual | |||
puts <<-USAGE | ||||
subtask_score problem last_submision_id sub1_score,sub2_score,sub3_score,.... | ||||
example: | ||||
rails runner subtask_score.rb o64_may26_train 102983 10,15,18,18,39 | ||||
USAGE | ||||
end | ||||
def process_options | ||||
res = {} | ||||
if ARGV.length == 0 | ||||
display_manual | ||||
exit(1) | ||||
end | ||||
res[:prob] = ARGV[0] | ||||
res[:last_sub_id] = ARGV[1].to_i | ||||
res[:score] = ARGV[2].split(',').map {|x| x.to_i} | ||||
return res | ||||
end | ||||
def process_subtask(st) | ||||
return true if /^P+$/.match(st) | ||||
return false | ||||
end | ||||
def process_comment(st) | ||||
res = [] | ||||
loop do | ||||
break if st.length == 0 | ||||
if st[0] == '[' | ||||
#subtask | ||||
subtask = st.slice!(0..(st.index(']'))) | ||||
res << process_subtask(subtask[1..-2]) | ||||
else #not subtask | ||||
res << process_subtask(st[0]) | ||||
st.slice!(0) | ||||
end | ||||
end | ||||
return res | ||||
end | ||||
options = process_options | ||||
scoring = options[:score] | ||||
puts "doing problem #{options[:prob]}" | ||||
puts " consider only submission with id not more than #{options[:last_sub_id]}" | ||||
scoring.each.with_index { |x,i| puts " subtask#{i}: #{x}" } | ||||
res = {} | ||||
p = Problem.where(name: options[:prob]).first | ||||
unless p | ||||
puts "Problem #{options[:prob]} not found" | ||||
exit(2) | ||||
end | ||||
p.submissions.where('id <= ?',options[:last_sub_id]).order(:id).each do |sub| | ||||
unless sub.graded_at | ||||
puts "skip ungraded submission #{sub.id}" | ||||
next | ||||
end | ||||
if sub.grader_comment == "compilation error" | ||||
puts "skip uncompilable submission #{sub.id}" | ||||
next | ||||
end | ||||
comment = sub.grader_comment.clone | ||||
comment_result = process_comment(comment) | ||||
if comment_result.length != scoring.length | ||||
puts "ERROR!!! subtask of submission #{sub.id} does not match scoring input" | ||||
end | ||||
puts "processing submission #{sub.id} with comment = #{sub.grader_comment} result is #{comment_result}" | ||||
current = res[sub.user.login] || [false] * scoring.length | ||||
current.each.with_index do |x,i| | ||||
if !x && comment_result[i] | ||||
puts " user #{sub.user.login} just got subtask #{i+1} from this submission" | ||||
current[i] = true | ||||
end | ||||
end | ||||
res[sub.user.login] = current | ||||
end | ||||
puts "----summary-----" | ||||
res.each do |u,r| | ||||
score = scoring.clone | ||||
r.each.with_index { |pass,i| score[i] = 0 unless pass } | ||||
puts "#{u} #{score.sum} [#{score.join(',')}]" | ||||
end | ||||