Description:
fix various bugs, save output, save comment git-svn-id: http://theory.cpe.ku.ac.th/grader/cli/trunk/scripts@21 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r8:4a121cdd0baf - - 3 files changed: 6 inserted, 7 deleted

@@ -1,69 +1,67
1 1 #!/usr/bin/ruby
2 2
3 3 def char_comment(comment)
4 4 if comment =~ /[iI]ncorrect/
5 5 '-'
6 6 elsif comment =~ /[Cc]orrect/
7 7 'P'
8 8 elsif comment =~ /[Tt]ime/
9 9 'T'
10 10 else
11 11 '?'
12 12 end
13 13 end
14 14
15 15 problem_home = ENV['PROBLEM_HOME']
16 16 require "#{problem_home}/script/test_dsl.rb"
17 17 load "#{problem_home}/test_cases/all_tests.cfg"
18 18 problem = Problem.get_instance
19 19
20 20 if problem.well_formed? == false
21 21 puts "The problem specification is not well formed."
22 22 exit(127)
23 23 end
24 24
25 25 all_score = 0
26 26 all_comment = ''
27 27 (1..(problem.runs.length-1)).each do |k|
28 28 run = problem.runs[k]
29 29 run_score = 0
30 30 run_comment = ''
31 + run_comment_short = ''
31 32 run.tests.each do |test_num|
32 33 result_file_name = "#{test_num}/result"
33 34 if not File.exists?(result_file_name)
34 35 puts "Cannot find the file #{test_num}/result!"
35 36 exit(127)
36 37 end
37 38
38 39 result_file = File.new(result_file_name, "r")
39 40 result_file_lines = result_file.readlines
40 41 run_score = run_score + result_file_lines[1].to_i
41 - # run_comment += char_comment(result_file_lines[0])
42 - result_file_lines.each do |l|
43 - run_comment += l
44 - end
45 - run_comment += "----\n"
42 + run_comment += result_file_lines[0]
43 + run_comment_short += char_comment(result_file_lines[0])
46 44 result_file.close
47 45 end
48 46
49 47 run_result_file = File.new("result-#{k}", "w")
50 48 run_result_file.write run_score
51 49 run_result_file.write "\n"
52 50 run_result_file.close
53 51
54 52 run_comment_file = File.new("comment-#{k}", "w")
55 53 run_comment_file.write "#{run_comment}\n"
56 54 run_comment_file.close
57 55
58 56 all_score = all_score + run_score
59 - all_comment += run_comment
57 + all_comment += run_comment_short
60 58 end
61 59
62 60 result_file = File.new("result", "w")
63 61 result_file.write all_score
64 62 result_file.write "\n"
65 63 result_file.close
66 64
67 65 comment_file = File.new("comment", "w")
68 66 comment_file.write "#{all_comment}\n"
69 67 comment_file.close
@@ -3,112 +3,113
3 3 problem_home = ENV['PROBLEM_HOME']
4 4
5 5 def execute(command, error_message="")
6 6 if not system(command)
7 7 puts "ERROR: #{error_message}"
8 8 exit(127)
9 9 end
10 10 end
11 11
12 12 # ARGV[0] --- language
13 13 # ARGV[1] --- program source file
14 14 # ARGV[2] --- test result directory
15 15 # ARGV[3] --- sandbox directory
16 16
17 17 if ARGV.length < 2 || ARGV.length > 4
18 18 puts "Usage: judge <language> <program-source> [<test-result-directory>] [<sandbox-directory>]"
19 19 puts " <sandbox-directory> is defaulted to ./sandbox"
20 20 puts " <test-result-directory> is defaulted to ./test-result"
21 21 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
22 22 exit(127)
23 23 end
24 24
25 25 language = ARGV[0]
26 26 if language != "c" && language != "c++" && language != "pascal"
27 27 puts "You specified a language that is not supported."
28 28 exit(127)
29 29 end
30 30
31 31 source_file = ARGV[1]
32 32 if File.exist?(source_file) == false
33 33 puts "The source file does not exist."
34 34 exit(127)
35 35 end
36 36
37 37 puts "Making test result and sandbox directories..."
38 38
39 39 current_dir = `pwd`
40 40 current_dir.strip!
41 41
42 42 if ARGV.length >= 3
43 43 test_result_dir = ARGV[2]
44 44 else
45 45 test_result_dir = "#{current_dir}/test-result"
46 46 end
47 47 puts "Test result directory: #{test_result_dir}"
48 48 system("rm -Rf #{test_result_dir}")
49 49 execute("mkdir #{test_result_dir}", "Cannot make directory #{test_result_dir}.")
50 50
51 51 if ARGV.length >= 4
52 52 sandbox_dir = ARGV[3]
53 53 else
54 54 sandbox_dir = "#{current_dir}/sandbox"
55 55 end
56 56 puts "Sandbox directory: #{sandbox_dir}"
57 57 system("rm -Rf #{sandbox_dir}")
58 58 execute("mkdir #{sandbox_dir}", "Cannot make directory #{sandbox_dir}")
59 59
60 60 # Compile
61 61 puts
62 62 puts "Compiling..."
63 63 execute("cp #{source_file} #{sandbox_dir}", "Cannot copy the source file to #{sandbox_dir}")
64 64 begin
65 65 Dir.chdir sandbox_dir
66 66 rescue
67 67 puts "ERROR: Cannot change directory to #{sandbox_dir}."
68 68 exit(127)
69 69 end
70 70 execute("#{problem_home}/script/compile #{language} #{source_file}", "Compilation error!")
71 71 compile_message = `cat compiler_message`
72 72 compile_message.strip!
73 73 execute("mv compiler_message #{test_result_dir}", "Cannot move the compiler message to #{test_result_dir}.")
74 74 if !FileTest.exist?("a.out")
75 75 puts "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
76 76 exit(127)
77 77 else
78 78 execute("mv a.out #{test_result_dir}", "Cannot move the compiled program to #{test_result_dir}")
79 79 system("rm -Rf #{sandbox_dir}/*")
80 80 end
81 81
82 82 require "#{problem_home}/script/test_dsl.rb"
83 83 load "#{problem_home}/test_cases/all_tests.cfg"
84 84 problem = Problem.get_instance
85 85
86 86 if problem.well_formed? == false
87 87 puts "The problem specification is not well formed."
88 88 exit(127)
89 89 end
90 90
91 91 # Doing the testing.
92 92 (1..(problem.num_tests)).each do |test_num|
93 93 puts
94 94 execute("cp #{test_result_dir}/a.out #{sandbox_dir}", "Cannot copy the compiled program into #{sandbox_dir}")
95 95 execute("#{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
96 96 execute("mkdir #{test_result_dir}/#{test_num}", "Cannot create directory #{test_result_dir}/#{test_num}")
97 97 execute("mv #{sandbox_dir}/result #{test_result_dir}/#{test_num}", "Cannot copy the result file into #{test_result_dir}/#{test_num}")
98 98 execute("mv #{sandbox_dir}/comment #{test_result_dir}/#{test_num}", "Cannot copy the comment file into #{test_result_dir}/#{test_num}")
99 + execute("mv #{sandbox_dir}/output.txt #{test_result_dir}/#{test_num}", "Cannot copy the output file into #{test_result_dir}/#{test_num}")
99 100 execute("rm -Rf #{sandbox_dir}/*", "Cannot clear #{sandbox_dir}")
100 101 end
101 102
102 103 # Grade
103 104 puts
104 105 puts "Grading..."
105 106 begin
106 107 Dir.chdir test_result_dir
107 108 rescue
108 109 puts "ERROR: Cannot change directory to #{test_result_dir}."
109 110 exit(127)
110 111 end
111 112 execute("#{problem_home}/script/grade", "An error occured during grading!")
112 113
113 114 puts
114 115 puts "All done!"
@@ -1,103 +1,103
1 1 #!/usr/bin/ruby
2 2
3 3 if ARGV.length < 2 || ARGV.length > 3
4 4 puts "Usage: run <language> <test-num> [<program-name>]"
5 5 exit(127)
6 6 end
7 7
8 8 language = ARGV[0]
9 9 test_num = ARGV[1].to_i
10 10 if ARGV.length > 2
11 11 program_name = ARGV[2]
12 12 else
13 13 program_name = "a.out"
14 14 end
15 15
16 16 problem_home = ENV['PROBLEM_HOME']
17 17 require "#{problem_home}/script/test_dsl.rb"
18 18 load "#{problem_home}/test_cases/all_tests.cfg"
19 19 problem = Problem.get_instance
20 20
21 21 if problem.well_formed? == false
22 22 puts "The problem specification is not well formed."
23 23 exit(127)
24 24 end
25 25
26 26 # Check if the test number is okay.
27 27 if test_num <= 0 || test_num > problem.num_tests
28 28 puts "You have specified a wrong test number."
29 29 exit(127)
30 30 end
31 31
32 32 #####################################
33 33 # Set the relavant file names here. #
34 34 #####################################
35 35
36 36 input_file_name = "#{problem_home}/test_cases/#{test_num}/input-#{test_num}.txt"
37 37
38 38 #####################################
39 39
40 40 time_limit = problem.get_time_limit test_num
41 41 mem_limit = problem.get_mem_limit(test_num) * 1024
42 42
43 43 # Copy the input file.
44 44 #`cp #{problem_home}/test_cases/#{test_num}/#{input_file_name} .`
45 45
46 46 # Run the program.
47 47 run_command = "/usr/bin/time -f \"%E\" 2>run_result #{problem_home}/script/box -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
48 48 puts "Running test #{test_num}..."
49 49 puts run_command
50 50 puts
51 51 system(run_command)
52 52
53 53 # Create the result file.
54 54 result_file = File.new("result", "w")
55 55 comment_file = File.new("comment", "w")
56 56
57 57 # Check if the program actually produced any output.
58 58 run_result_file = File.new("run_result", "r")
59 59 run_result = run_result_file.readlines
60 60 run_result_file.close
61 61 time_elapsed = run_result[run_result.length-1]
62 62
63 63 report = lambda{ |status, points, comment|
64 64 result_file.write status.strip
65 65 result_file.write "\n"
66 66 result_file.write points.to_s.strip
67 67 result_file.write "\n"
68 68 result_file.write time_elapsed.strip
69 69 result_file.write "\n"
70 70 result_file.close
71 71 `rm run_result`
72 - `rm output.txt`
72 + # `rm output.txt` --- keep the output
73 73
74 74 comment_file.write comment
75 75 comment_file.write "--run-result--\n"
76 76 run_result.each do |l|
77 77 comment_file.write l
78 78 end
79 79 comment_file.close
80 80
81 81 puts
82 82 puts "Done!"
83 83 exit(0)
84 84 }
85 85
86 86 if run_result[0][0,2] != "OK"
87 87 puts "There was a runtime error."
88 88 report.call(run_result[0], 0, "No comment.\n")
89 89 end
90 90
91 91 # Run 'check' to evaluate the output.
92 92 #puts "There was no runtime error. Proceed to checking the output."
93 93 check_command = "#{problem_home}/script/check #{language} #{test_num}"
94 94 puts "Checking the output..."
95 95 puts check_command
96 96 if not system(check_command)
97 97 exit(127)
98 98 end
99 99
100 100 check_file = File.new("check_result", "r")
101 101 check_file_lines = check_file.readlines
102 102
103 103 report.call(check_file_lines[0], check_file_lines[1], "No comment.\n")
You need to be logged in to leave comments. Login now