Description:
add more languages, java and ruby add bookmark algo-bm and branch algo
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r147:9e3cee7d454d - - 5 files changed: 54 inserted, 7 deleted

@@ -17,28 +17,31
17 end
17 end
18 if ENV['GRADER_LOGGING']!=nil
18 if ENV['GRADER_LOGGING']!=nil
19 log_fname = ENV['GRADER_LOGGING']
19 log_fname = ENV['GRADER_LOGGING']
20 fp = File.open(log_fname,"a")
20 fp = File.open(log_fname,"a")
21 fp.puts("run: #{Time.new.strftime("%H:%M")} #{msg}")
21 fp.puts("run: #{Time.new.strftime("%H:%M")} #{msg}")
22 fp.close
22 fp.close
23 end
23 end
24 end
24 end
25
25
26 C_COMPILER = "/usr/bin/gcc"
26 C_COMPILER = "/usr/bin/gcc"
27 CPLUSPLUS_COMPILER = "/usr/bin/g++"
27 CPLUSPLUS_COMPILER = "/usr/bin/g++"
28 PASCAL_COMPILER = "/usr/bin/fpc"
28 PASCAL_COMPILER = "/usr/bin/fpc"
29 + JAVA_COMPILER = "/usr/bin/javac"
30 + RUBY_INTEPRETER = "/home/dae/.rvm/rubies/ruby-1.9.2-p320/bin/ruby"
29
31
30 C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
32 C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
31 CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall"
33 CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall"
32 PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
34 PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
35 + JAVA_OPTIONS = ""
33
36
34 # Check for the correct number of arguments. Otherwise, print usage.
37 # Check for the correct number of arguments. Otherwise, print usage.
35 if ARGV.length == 0 or ARGV.length > 4
38 if ARGV.length == 0 or ARGV.length > 4
36 puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
39 puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
37 puts
40 puts
38 puts "<source-file> is defaulted to \"source\"."
41 puts "<source-file> is defaulted to \"source\"."
39 puts "<output-file> is defaulted to \"a.out\"."
42 puts "<output-file> is defaulted to \"a.out\"."
40 puts "<message-file> is defaulted to \"compiler_message\"."
43 puts "<message-file> is defaulted to \"compiler_message\"."
41 puts
44 puts
42 exit(127)
45 exit(127)
43 end
46 end
44
47
@@ -87,24 +90,50
87 when "c"
90 when "c"
88 command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
91 command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
89 system(command)
92 system(command)
90
93
91 when "c++"
94 when "c++"
92 command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
95 command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
93 system(command)
96 system(command)
94
97
95 when "pas"
98 when "pas"
96 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
99 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
97 system(command)
100 system(command)
98 FileUtils.mv("output", params[:output_file])
101 FileUtils.mv("output", params[:output_file])
102 +
103 + when "java"
104 + #rename the file to the public class name
105 +
106 + #get the class name
107 + classname = 'DUMMY'
108 + File.foreach(params[:source_file]) do |line|
109 + md = /\s*public\s*class\s*(\w*)/.match(line)
110 + classname=md[1] if md
111 + end
112 + system("cp #{params[:source_file]} #{classname}.java")
113 + command = "#{JAVA_COMPILER} #{classname}.java > #{params[:message_file]}"
114 + system(command)
115 + File.open(params[:output_file],"w") {|file| file.write("#!/bin/sh\n/usr/bin/java #{classname}\n")}
116 + File.chmod(0755, params[:output_file])
117 +
118 + when "ruby"
119 + command = "#{RUBY_INTEPRETER} -c #{params[:source_file]} > #{params[:message_file]}"
120 + system(command)
121 + File.open(params[:output_file],"w") do |out_file|
122 + out_file.puts "#!#{RUBY_INTEPRETER}"
123 + File.open(params[:source_file],"r").each do |line|
124 + out_file.print line
125 + end
126 + end
127 + File.chmod(0755, params[:output_file])
99
128
100 else
129 else
101 talk("ERROR: Invalid language specified!")
130 talk("ERROR: Invalid language specified!")
102 open(params[:message_file],"w") do |f|
131 open(params[:message_file],"w") do |f|
103 f.puts "ERROR: Invalid language specified!"
132 f.puts "ERROR: Invalid language specified!"
104 end
133 end
105 exit(127)
134 exit(127)
106 end
135 end
107
136
108 # Report success or failure.
137 # Report success or failure.
109 if FileTest.exists? params[:output_file]
138 if FileTest.exists? params[:output_file]
110 talk "Compilation was successful!"
139 talk "Compilation was successful!"
@@ -44,25 +44,25
44 # ARGV[2] --- test result directory
44 # ARGV[2] --- test result directory
45 # ARGV[3] --- sandbox directory
45 # ARGV[3] --- sandbox directory
46
46
47 if ARGV.length < 2 || ARGV.length > 4
47 if ARGV.length < 2 || ARGV.length > 4
48 puts "Usage: judge <language> <program-source> [<test-result-directory>] [<sandbox-directory>]"
48 puts "Usage: judge <language> <program-source> [<test-result-directory>] [<sandbox-directory>]"
49 puts " <sandbox-directory> is defaulted to ./sandbox"
49 puts " <sandbox-directory> is defaulted to ./sandbox"
50 puts " <test-result-directory> is defaulted to ./test-result"
50 puts " <test-result-directory> is defaulted to ./test-result"
51 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
51 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
52 exit(127)
52 exit(127)
53 end
53 end
54
54
55 language = ARGV[0]
55 language = ARGV[0]
56 - if language != "c" && language != "c++" && language != "pas"
56 + if language != "c" && language != "c++" && language != "pas" && language != "java" && language != "ruby"
57 log "You specified a language that is not supported: #{language}."
57 log "You specified a language that is not supported: #{language}."
58 exit(127)
58 exit(127)
59 end
59 end
60
60
61 source_file = ARGV[1]
61 source_file = ARGV[1]
62 if File.exist?(source_file) == false
62 if File.exist?(source_file) == false
63 log "The source file does not exist."
63 log "The source file does not exist."
64 exit(127)
64 exit(127)
65 end
65 end
66
66
67 log "Making test result and sandbox directories..."
67 log "Making test result and sandbox directories..."
68
68
@@ -101,47 +101,49
101 execute("#{problem_home}/script/compile #{language} #{source_file}", "Compilation error!")
101 execute("#{problem_home}/script/compile #{language} #{source_file}", "Compilation error!")
102 compile_message = open("compiler_message").read
102 compile_message = open("compiler_message").read
103 compile_message.strip!
103 compile_message.strip!
104 call_and_log("Cannot move the compiler message to #{test_result_dir}.") {
104 call_and_log("Cannot move the compiler message to #{test_result_dir}.") {
105 FileUtils.mv("compiler_message", test_result_dir)
105 FileUtils.mv("compiler_message", test_result_dir)
106 }
106 }
107 if !FileTest.exist?("a.out")
107 if !FileTest.exist?("a.out")
108 log "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
108 log "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
109 exit(127)
109 exit(127)
110 else
110 else
111 call_and_log("Cannot move the compiled program to #{test_result_dir}") {
111 call_and_log("Cannot move the compiled program to #{test_result_dir}") {
112 FileUtils.mv("a.out",test_result_dir)
112 FileUtils.mv("a.out",test_result_dir)
113 + if language == "java" then Dir["*.class"].each { |file| FileUtils.mv(file,test_result_dir)} end
113 }
114 }
114 FileUtils.rm_rf("#{sandbox_dir}/.")
115 FileUtils.rm_rf("#{sandbox_dir}/.")
115 end
116 end
116
117
117 require "#{problem_home}/script/test_dsl.rb"
118 require "#{problem_home}/script/test_dsl.rb"
118 load "#{problem_home}/test_cases/all_tests.cfg"
119 load "#{problem_home}/test_cases/all_tests.cfg"
119 problem = Problem.get_instance
120 problem = Problem.get_instance
120
121
121 if problem.well_formed? == false
122 if problem.well_formed? == false
122 log "The problem specification is not well formed."
123 log "The problem specification is not well formed."
123 exit(127)
124 exit(127)
124 end
125 end
125
126
126 # Doing the testing.
127 # Doing the testing.
127 (1..(problem.num_tests)).each do |test_num|
128 (1..(problem.num_tests)).each do |test_num|
128
129
129 $stdout.print "[#{test_num}]"
130 $stdout.print "[#{test_num}]"
130 $stdout.flush
131 $stdout.flush
131
132
132 log "Test number: #{test_num}"
133 log "Test number: #{test_num}"
133
134
134 call_and_log("Cannot copy the compiled program into #{sandbox_dir}") {
135 call_and_log("Cannot copy the compiled program into #{sandbox_dir}") {
135 FileUtils.cp("#{test_result_dir}/a.out", sandbox_dir, :preserve => true)
136 FileUtils.cp("#{test_result_dir}/a.out", sandbox_dir, :preserve => true)
137 + if language == "java" then Dir["#{test_result_dir}/*.class"].each { |file| FileUtils.cp(file,sandbox_dir)} end
136 }
138 }
137
139
138 begin
140 begin
139 execute("#{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
141 execute("#{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
140 rescue
142 rescue
141 # do nothing
143 # do nothing
142 end
144 end
143
145
144 call_and_log("Cannot create directory #{test_result_dir}/#{test_num}") {
146 call_and_log("Cannot create directory #{test_result_dir}/#{test_num}") {
145 FileUtils.mkdir "#{test_result_dir}/#{test_num}"
147 FileUtils.mkdir "#{test_result_dir}/#{test_num}"
146 }
148 }
147 call_and_log("Cannot copy the result file into #{test_result_dir}/#{test_num}") {
149 call_and_log("Cannot copy the result file into #{test_result_dir}/#{test_num}") {
@@ -6,26 +6,27
6 if ENV['TALKATIVE']!=nil
6 if ENV['TALKATIVE']!=nil
7 puts str
7 puts str
8 end
8 end
9 if ENV['GRADER_LOGGING']!=nil
9 if ENV['GRADER_LOGGING']!=nil
10 log_fname = ENV['GRADER_LOGGING']
10 log_fname = ENV['GRADER_LOGGING']
11 fp = File.open(log_fname,"a")
11 fp = File.open(log_fname,"a")
12 fp.puts("run: #{Time.new.strftime("%H:%M")} #{str}")
12 fp.puts("run: #{Time.new.strftime("%H:%M")} #{str}")
13 fp.close
13 fp.close
14 end
14 end
15 end
15 end
16
16
17 def extract_time(t)
17 def extract_time(t)
18 - # puts "TIME: #{t}"
18 + #puts "TIME: #{t}"
19 - if (result=/^(.*)r(.*)u(.*)s/.match(t))
19 + #if (result=/^(.*)real(.*)wall(.*)s/.match(t))
20 + if (result=/^OK \((.*) sec real\, (.*) sec wall,.*MB, (.*) syscalls/.match(t))
20 {:real => result[1], :user => result[2], :sys => result[3]}
21 {:real => result[1], :user => result[2], :sys => result[3]}
21 else
22 else
22 #{:real => 0, :user => 0, :sys => 0}
23 #{:real => 0, :user => 0, :sys => 0}
23 #puts "ERROR READING RUNNING TIME: #{t}"
24 #puts "ERROR READING RUNNING TIME: #{t}"
24 raise "Error reading running time: #{t}"
25 raise "Error reading running time: #{t}"
25 end
26 end
26 end
27 end
27
28
28 def compile_box(source,bin)
29 def compile_box(source,bin)
29 system("g++ #{source} -o #{bin}")
30 system("g++ #{source} -o #{bin}")
30 end
31 end
31
32
@@ -75,26 +76,41
75 # check if box is there, if not, compile it!
76 # check if box is there, if not, compile it!
76 if !File.exists?("#{problem_home}/script/box")
77 if !File.exists?("#{problem_home}/script/box")
77 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
78 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
78 compile_box("#{problem_home}/script/box.cc",
79 compile_box("#{problem_home}/script/box.cc",
79 "#{problem_home}/script/box")
80 "#{problem_home}/script/box")
80 end
81 end
81
82
82 # Hide PROBLEM_HOME
83 # Hide PROBLEM_HOME
83 ENV['PROBLEM_HOME'] = nil
84 ENV['PROBLEM_HOME'] = nil
84
85
85 # Run the program.
86 # Run the program.
86 #run_command = "/usr/bin/time -f \"#{time_output_format}\" 2>run_result #{problem_home}/script/box_new -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
87 #run_command = "/usr/bin/time -f \"#{time_output_format}\" 2>run_result #{problem_home}/script/box_new -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
88 + #
87
89
88 - run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
90 +
91 +
92 +
93 + case language
94 + when "java"
95 + # for java, we have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
96 + run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s clone -s wait4 -p /usr/bin/ -p ./ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
97 + when "ruby"
98 + run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s wait4 -s clone -s set_robust_list -s futex -s sigaltstack -p /dev/urandom -p ./ -p /home/dae/.rvm/rubies/ruby-1.9.2-p320/ -p #{problem_home}/ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
99 + when "c++"
100 + run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
101 + else
102 + run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
103 + end
104 +
89
105
90 log "Running test #{test_num}..."
106 log "Running test #{test_num}..."
91 log run_command
107 log run_command
92 log
108 log
93 system(run_command)
109 system(run_command)
94
110
95 # Restore PROBLEM_HOME
111 # Restore PROBLEM_HOME
96 ENV['PROBLEM_HOME'] = problem_home
112 ENV['PROBLEM_HOME'] = problem_home
97
113
98 # Create the result file.
114 # Create the result file.
99 result_file = File.new("result", "w")
115 result_file = File.new("result", "w")
100 comment_file = File.new("comment", "w")
116 comment_file = File.new("comment", "w")
@@ -128,25 +144,25
128
144
129 comment_file.close
145 comment_file.close
130
146
131 log "Done!"
147 log "Done!"
132 exit(0)
148 exit(0)
133 }
149 }
134
150
135 if run_result[0][0,2] != "OK"
151 if run_result[0][0,2] != "OK"
136 log "There was a runtime error."
152 log "There was a runtime error."
137 report.call(run_result[0], 0, "No comment.\n")
153 report.call(run_result[0], 0, "No comment.\n")
138 end
154 end
139
155
140 - if running_time[:user].to_f + running_time[:sys].to_f > time_limit
156 + if running_time[:user].to_f > time_limit
141 log "Time limit exceeded."
157 log "Time limit exceeded."
142 report.call("Time limit exceeded", 0, "No comment.\n")
158 report.call("Time limit exceeded", 0, "No comment.\n")
143 end
159 end
144
160
145 # Run 'check' to evaluate the output.
161 # Run 'check' to evaluate the output.
146 #puts "There was no runtime error. Proceed to checking the output."
162 #puts "There was no runtime error. Proceed to checking the output."
147 check_command = "#{problem_home}/script/check #{language} #{test_num}"
163 check_command = "#{problem_home}/script/check #{language} #{test_num}"
148 log "Checking the output..."
164 log "Checking the output..."
149 log check_command
165 log check_command
150 if not system(check_command)
166 if not system(check_command)
151 log "Problem with check script"
167 log "Problem with check script"
152 report.call("Incorrect",0,"Check script error.\n")
168 report.call("Incorrect",0,"Check script error.\n")
@@ -1,13 +1,13
1 - #!/usr/bin/ruby
1 + #!/usr/bin/env ruby
2
2
3 problem_home = ENV['PROBLEM_HOME']
3 problem_home = ENV['PROBLEM_HOME']
4 require "#{problem_home}/script/test_dsl.rb"
4 require "#{problem_home}/script/test_dsl.rb"
5
5
6 if ARGV.length < 2
6 if ARGV.length < 2
7 puts "Usage: check <language> <test-number> [<output-file>]"
7 puts "Usage: check <language> <test-number> [<output-file>]"
8 exit(0)
8 exit(0)
9 end
9 end
10
10
11 language = ARGV[0]
11 language = ARGV[0]
12 test_num = ARGV[1].to_i
12 test_num = ARGV[1].to_i
13 if ARGV.length >= 3
13 if ARGV.length >= 3
@@ -1,13 +1,13
1 - #!/usr/bin/ruby
1 + #!/usr/bin/env ruby
2
2
3 problem_home = ENV['PROBLEM_HOME']
3 problem_home = ENV['PROBLEM_HOME']
4 require "#{problem_home}/script/test_dsl.rb"
4 require "#{problem_home}/script/test_dsl.rb"
5
5
6 if ARGV.length < 2
6 if ARGV.length < 2
7 puts "Usage: check <language> <test-number> [<output-file>]"
7 puts "Usage: check <language> <test-number> [<output-file>]"
8 exit(0)
8 exit(0)
9 end
9 end
10
10
11 language = ARGV[0]
11 language = ARGV[0]
12 test_num = ARGV[1].to_i
12 test_num = ARGV[1].to_i
13 if ARGV.length >= 3
13 if ARGV.length >= 3
You need to be logged in to leave comments. Login now