Description:
checks solution by lines
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r384:7f104b042855 - - 1 file changed: 9 inserted, 3 deleted

@@ -254,104 +254,110
254 if !problem.available
254 if !problem.available
255 flash[:notice] = 'Error: problem is not available'
255 flash[:notice] = 'Error: problem is not available'
256 redirect_to :action => 'list'
256 redirect_to :action => 'list'
257 else
257 else
258 test_pair = TestPair.get_for(problem, true)
258 test_pair = TestPair.get_for(problem, true)
259
259
260 user = User.find(session[:user_id])
260 user = User.find(session[:user_id])
261 assignment = user.get_test_pair_assignment_for(problem)
261 assignment = user.get_test_pair_assignment_for(problem)
262
262
263 if !assignment
263 if !assignment
264 assignment = TestPairAssignment.create_for(user, problem, test_pair)
264 assignment = TestPairAssignment.create_for(user, problem, test_pair)
265 assignment.save
265 assignment.save
266 end
266 end
267
267
268 send_data(test_pair.input,
268 send_data(test_pair.input,
269 {:filename => problem.name + '-input.txt',
269 {:filename => problem.name + '-input.txt',
270 :type => 'text/plain'})
270 :type => 'text/plain'})
271 end
271 end
272 end
272 end
273
273
274 def verifying_submit
274 def verifying_submit
275 user = User.find(session[:user_id])
275 user = User.find(session[:user_id])
276 problem_id = params[:id]
276 problem_id = params[:id]
277 problem = Problem.find(problem_id)
277 problem = Problem.find(problem_id)
278
278
279 if !problem or !problem.available
279 if !problem or !problem.available
280 flash[:notice] = 'Error: problem is not available'
280 flash[:notice] = 'Error: problem is not available'
281 redirect_to :action => 'list' and return
281 redirect_to :action => 'list' and return
282 end
282 end
283
283
284 @current_problem = problem
284 @current_problem = problem
285 test_pair = TestPair.get_for(problem, false)
285 test_pair = TestPair.get_for(problem, false)
286 if (params['output_file']) and (params['output_file']!='')
286 if (params['output_file']) and (params['output_file']!='')
287 output = params['output_file'].read
287 output = params['output_file'].read
288
288
289 @grading_result = grade(output, test_pair.solution)
289 @grading_result = grade(output, test_pair.solution)
290 prepare_list_information
290 prepare_list_information
291 render :action => 'list' and return
291 render :action => 'list' and return
292 else
292 else
293 flash[:notice] = 'Error: output file errors'
293 flash[:notice] = 'Error: output file errors'
294 prepare_list_information
294 prepare_list_information
295 render :action => 'list' and return
295 render :action => 'list' and return
296 end
296 end
297 end
297 end
298
298
299 protected
299 protected
300
300
301 def grade(output, solution)
301 def grade(output, solution)
302 - out_items = output.split
302 + out_items = output.split("\n")
303 - sol_items = solution.split
303 + sol_items = solution.split("\n")
304 res = ''
304 res = ''
305 f = 0
305 f = 0
306 s = 0
306 s = 0
307 sol_items.length.times do |i|
307 sol_items.length.times do |i|
308 f += 1
308 f += 1
309 - if out_items[i] == sol_items[i]
309 + si = sol_items[i].chomp
310 + if out_items[i]
311 + oi = out_items[i].chomp
312 + else
313 + oi = ''
314 + end
315 + if oi == si
310 res = res + 'P'
316 res = res + 'P'
311 s += 1
317 s += 1
312 else
318 else
313 res = res + '-'
319 res = res + '-'
314 end
320 end
315 end
321 end
316 return { :score => s, :full_score => f, :msg => res }
322 return { :score => s, :full_score => f, :msg => res }
317 end
323 end
318
324
319 def prepare_announcements(recent=nil)
325 def prepare_announcements(recent=nil)
320 if GraderConfiguration.show_tasks_to?(@user)
326 if GraderConfiguration.show_tasks_to?(@user)
321 @announcements = Announcement.find_published(true)
327 @announcements = Announcement.find_published(true)
322 else
328 else
323 @announcements = Announcement.find_published
329 @announcements = Announcement.find_published
324 end
330 end
325 if recent!=nil
331 if recent!=nil
326 recent_id = recent.to_i
332 recent_id = recent.to_i
327 @announcements = @announcements.find_all { |a| a.id > recent_id }
333 @announcements = @announcements.find_all { |a| a.id > recent_id }
328 end
334 end
329 end
335 end
330
336
331 def prepare_timeout_information(problems)
337 def prepare_timeout_information(problems)
332 @submission_timeouts = {}
338 @submission_timeouts = {}
333 problems.each do |problem|
339 problems.each do |problem|
334 assignment = @user.get_test_pair_assignment_for(problem)
340 assignment = @user.get_test_pair_assignment_for(problem)
335 if assignment == nil
341 if assignment == nil
336 timeout = nil
342 timeout = nil
337 else
343 else
338 if (assignment.expired?) or (assignment.submitted)
344 if (assignment.expired?) or (assignment.submitted)
339 timeout = 0
345 timeout = 0
340 else
346 else
341 timeout = assignment.created_at + TEST_ASSIGNMENT_EXPIRATION_DURATION - Time.new.gmtime
347 timeout = assignment.created_at + TEST_ASSIGNMENT_EXPIRATION_DURATION - Time.new.gmtime
342 end
348 end
343 end
349 end
344 @submission_timeouts[problem.id] = timeout
350 @submission_timeouts[problem.id] = timeout
345 end
351 end
346 end
352 end
347
353
348 def prepare_list_information
354 def prepare_list_information
349 @user = User.find(session[:user_id])
355 @user = User.find(session[:user_id])
350 if not GraderConfiguration.multicontests?
356 if not GraderConfiguration.multicontests?
351 @problems = @user.available_problems
357 @problems = @user.available_problems
352 else
358 else
353 @contest_problems = @user.available_problems_group_by_contests
359 @contest_problems = @user.available_problems_group_by_contests
354 @problems = @user.available_problems
360 @problems = @user.available_problems
355 end
361 end
356 @prob_submissions = {}
362 @prob_submissions = {}
357 @problems.each do |p|
363 @problems.each do |p|
You need to be logged in to leave comments. Login now