Description:
import_problem now remove carriage return from the input file
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r248:617a22a897aa - - 2 files changed: 8 inserted, 2 deleted

@@ -1,228 +1,231
1 #!/usr/bin/env ruby
1 #!/usr/bin/env ruby
2
2
3 require 'erb'
3 require 'erb'
4 require 'fileutils'
4 require 'fileutils'
5 require File.join(File.dirname(__FILE__),'lib/import_helper')
5 require File.join(File.dirname(__FILE__),'lib/import_helper')
6
6
7 JUDGE_ENVIRONMENTS = [:grading, :exam]
7 JUDGE_ENVIRONMENTS = [:grading, :exam]
8 ENV_INFO = {
8 ENV_INFO = {
9 :grading => {
9 :grading => {
10 :ev_dir => 'ev',
10 :ev_dir => 'ev',
11 :raw_prefix => '',
11 :raw_prefix => '',
12 },
12 },
13 :exam => {
13 :exam => {
14 :ev_dir => 'ev-exam',
14 :ev_dir => 'ev-exam',
15 :raw_prefix => 'ex.',
15 :raw_prefix => 'ex.',
16 }
16 }
17 }
17 }
18
18
19 def input_filename(dir,i)
19 def input_filename(dir,i)
20 "#{dir}/input-#{i}.txt"
20 "#{dir}/input-#{i}.txt"
21 end
21 end
22
22
23 def answer_filename(dir,i)
23 def answer_filename(dir,i)
24 "#{dir}/answer-#{i}.txt"
24 "#{dir}/answer-#{i}.txt"
25 end
25 end
26
26
27 def build_testrun_info_from_dir(num_testruns, importing_test_dir, raw_prefix='')
27 def build_testrun_info_from_dir(num_testruns, importing_test_dir, raw_prefix='')
28 filenames = Dir["#{importing_test_dir}/#{raw_prefix}*.in"].collect do |filename|
28 filenames = Dir["#{importing_test_dir}/#{raw_prefix}*.in"].collect do |filename|
29 File.basename((/(.*)\.in/.match(filename))[1])
29 File.basename((/(.*)\.in/.match(filename))[1])
30 end
30 end
31 build_testrun_info(num_testruns,filenames,raw_prefix)
31 build_testrun_info(num_testruns,filenames,raw_prefix)
32 end
32 end
33
33
34 def copy_testcase(importing_test_dir,fname,dir,i)
34 def copy_testcase(importing_test_dir,fname,dir,i)
35 - FileUtils.cp("#{importing_test_dir}/#{fname}.in", "#{input_filename(dir,i)}")
35 + #copy the file from importing dir and also remove carriage return
36 - FileUtils.cp("#{importing_test_dir}/#{fname}.sol", "#{answer_filename(dir,i)}")
36 + a = File.read("#{importing_test_dir}/#{fname}.in").gsub(/\r\n?/,"\n")
37 + File.write("#{input_filename(dir,i)}",a)
38 + b = File.read("#{importing_test_dir}/#{fname}.sol").gsub(/\r\n?/,"\n")
39 + File.write("#{answer_filename(dir,i)}",b)
37 end
40 end
38
41
39 def process_options(options)
42 def process_options(options)
40 i = 3
43 i = 3
41 while i<ARGV.length
44 while i<ARGV.length
42 if ARGV[i]=='-t'
45 if ARGV[i]=='-t'
43 options[:time_limit] = ARGV[i+1].to_f if ARGV.length>i+1
46 options[:time_limit] = ARGV[i+1].to_f if ARGV.length>i+1
44 i += 1
47 i += 1
45 end
48 end
46 if ARGV[i]=='-m'
49 if ARGV[i]=='-m'
47 options[:mem_limit] = ARGV[i+1].to_i if ARGV.length>i+1
50 options[:mem_limit] = ARGV[i+1].to_i if ARGV.length>i+1
48 i += 1
51 i += 1
49 end
52 end
50 i += 1
53 i += 1
51 end
54 end
52 end
55 end
53
56
54 def print_usage
57 def print_usage
55 puts "using: import_problem_new name dir check [options]
58 puts "using: import_problem_new name dir check [options]
56
59
57 where: name = problem_name (put '-' (dash) to use dir name)
60 where: name = problem_name (put '-' (dash) to use dir name)
58 dir = importing testcase directory
61 dir = importing testcase directory
59 check = check script, which can be
62 check = check script, which can be
60 'integer', 'text' (for standard script),
63 'integer', 'text' (for standard script),
61 path_to_your_script, or
64 path_to_your_script, or
62 'wrapper:(path_to_your_wrapped_script)'
65 'wrapper:(path_to_your_wrapped_script)'
63 options: -t time-limit (in seconds)
66 options: -t time-limit (in seconds)
64 -m memory-limit (in megabytes)
67 -m memory-limit (in megabytes)
65
68
66 The script looks at test data files in the dir of the forms: *.in and
69 The script looks at test data files in the dir of the forms: *.in and
67 *.sol and import them to the evaluation dir for their environment,
70 *.sol and import them to the evaluation dir for their environment,
68 based on their prefixes.
71 based on their prefixes.
69
72
70 Currently supporting environments are:"
73 Currently supporting environments are:"
71
74
72 JUDGE_ENVIRONMENTS.each do |env|
75 JUDGE_ENVIRONMENTS.each do |env|
73 prefix = ENV_INFO[env][:raw_prefix]
76 prefix = ENV_INFO[env][:raw_prefix]
74 prefix = 'no prefix' if prefix==''
77 prefix = 'no prefix' if prefix==''
75 puts " * #{env}"
78 puts " * #{env}"
76 puts " import to: #{ENV_INFO[env][:ev_dir]}"
79 puts " import to: #{ENV_INFO[env][:ev_dir]}"
77 puts " prefix with: #{prefix} (e.g., #{ENV_INFO[env][:raw_prefix]}1.in, #{ENV_INFO[env][:raw_prefix]}5a.sol)"
80 puts " prefix with: #{prefix} (e.g., #{ENV_INFO[env][:raw_prefix]}1.in, #{ENV_INFO[env][:raw_prefix]}5a.sol)"
78 end
81 end
79
82
80 puts"
83 puts"
81 For each environment, the script
84 For each environment, the script
82 * creates a directory for a problem in ev dir of that environment,
85 * creates a directory for a problem in ev dir of that environment,
83 * copies testdata in the old format and create standard testcase config file
86 * copies testdata in the old format and create standard testcase config file
84 * copies a check script for grading
87 * copies a check script for grading
85 * creates a test_request template in the ev dir + '/test_request'
88 * creates a test_request template in the ev dir + '/test_request'
86
89
87 For wrapped checked script see comment in templates/check_wrapper for
90 For wrapped checked script see comment in templates/check_wrapper for
88 information."
91 information."
89 end
92 end
90
93
91 def count_testruns(testcase_dir, raw_prefix)
94 def count_testruns(testcase_dir, raw_prefix)
92 n = 0
95 n = 0
93 begin
96 begin
94 # check for test case n+1
97 # check for test case n+1
95 if ((Dir["#{testcase_dir}/#{raw_prefix}#{n+1}.in"].length==0) and
98 if ((Dir["#{testcase_dir}/#{raw_prefix}#{n+1}.in"].length==0) and
96 (Dir["#{testcase_dir}/#{raw_prefix}#{n+1}[a-z].in"].length==0))
99 (Dir["#{testcase_dir}/#{raw_prefix}#{n+1}[a-z].in"].length==0))
97 return n
100 return n
98 end
101 end
99 n += 1
102 n += 1
100 end while true
103 end while true
101 end
104 end
102
105
103 def create_dir_if_not_exists(dir, options = {} )
106 def create_dir_if_not_exists(dir, options = {} )
104 if ! FileTest.exists? dir
107 if ! FileTest.exists? dir
105 FileUtils.mkdir(dir)
108 FileUtils.mkdir(dir)
106 end
109 end
107
110
108 FileUtils.rm_rf(Dir.glob("#{dir}/*")) if options[:clear]
111 FileUtils.rm_rf(Dir.glob("#{dir}/*")) if options[:clear]
109 end
112 end
110
113
111 def import_problem(ev_dir, problem, testcase_dir, num_testruns, raw_prefix, check_script, options)
114 def import_problem(ev_dir, problem, testcase_dir, num_testruns, raw_prefix, check_script, options)
112 testrun_info = build_testrun_info_from_dir(num_testruns, testcase_dir, raw_prefix)
115 testrun_info = build_testrun_info_from_dir(num_testruns, testcase_dir, raw_prefix)
113
116
114 if !(FileTest.exists? ev_dir)
117 if !(FileTest.exists? ev_dir)
115 puts "Testdata dir (#{ev_dir}) not found."
118 puts "Testdata dir (#{ev_dir}) not found."
116 return
119 return
117 end
120 end
118
121
119 problem_dir = "#{ev_dir}/#{problem}"
122 problem_dir = "#{ev_dir}/#{problem}"
120
123
121 # start working
124 # start working
122 puts "creating directories"
125 puts "creating directories"
123
126
124 create_dir_if_not_exists("#{problem_dir}")
127 create_dir_if_not_exists("#{problem_dir}")
125 create_dir_if_not_exists("#{problem_dir}/script")
128 create_dir_if_not_exists("#{problem_dir}/script")
126 create_dir_if_not_exists("#{problem_dir}/test_cases",clear: true)
129 create_dir_if_not_exists("#{problem_dir}/test_cases",clear: true)
127 # clear test cases directory
130 # clear test cases directory
128
131
129 puts "copying testcases"
132 puts "copying testcases"
130
133
131 tr_num = 0
134 tr_num = 0
132
135
133 num_testcases = 0
136 num_testcases = 0
134
137
135 testrun_info.each do |testrun|
138 testrun_info.each do |testrun|
136 tr_num += 1
139 tr_num += 1
137 puts "testrun: #{tr_num}"
140 puts "testrun: #{tr_num}"
138
141
139 testrun.each do |testcase_info|
142 testrun.each do |testcase_info|
140 testcase_num, testcase_fname = testcase_info
143 testcase_num, testcase_fname = testcase_info
141
144
142 puts "copy #{testcase_fname} to #{testcase_num}"
145 puts "copy #{testcase_fname} to #{testcase_num}"
143
146
144 create_dir_if_not_exists("#{problem_dir}/test_cases/#{testcase_num}")
147 create_dir_if_not_exists("#{problem_dir}/test_cases/#{testcase_num}")
145 copy_testcase("#{testcase_dir}",testcase_fname,"#{problem_dir}/test_cases/#{testcase_num}",testcase_num)
148 copy_testcase("#{testcase_dir}",testcase_fname,"#{problem_dir}/test_cases/#{testcase_num}",testcase_num)
146
149
147 num_testcases += 1
150 num_testcases += 1
148 end
151 end
149 end
152 end
150
153
151 #also include any .txt files
154 #also include any .txt files
152 Dir.glob("#{testcase_dir}/*.txt") do |file|
155 Dir.glob("#{testcase_dir}/*.txt") do |file|
153 puts "copy data file #{file}"
156 puts "copy data file #{file}"
154 FileUtils.cp(file,"#{problem_dir}")
157 FileUtils.cp(file,"#{problem_dir}")
155 end
158 end
156
159
157 # generating all_tests.cfg
160 # generating all_tests.cfg
158 puts "generating testcase config file"
161 puts "generating testcase config file"
159
162
160 template = File.open(SCRIPT_DIR + "/templates/all_tests.cfg.erb").read
163 template = File.open(SCRIPT_DIR + "/templates/all_tests.cfg.erb").read
161 all_test_cfg = ERB.new(template)
164 all_test_cfg = ERB.new(template)
162
165
163 cfg_file = File.open("#{problem_dir}/test_cases/all_tests.cfg","w")
166 cfg_file = File.open("#{problem_dir}/test_cases/all_tests.cfg","w")
164 cfg_file.puts all_test_cfg.result binding
167 cfg_file.puts all_test_cfg.result binding
165 cfg_file.close
168 cfg_file.close
166
169
167 # copy check script
170 # copy check script
168 if res = /^wrapper:(.*)$/.match(check_script)
171 if res = /^wrapper:(.*)$/.match(check_script)
169 # wrapper script
172 # wrapper script
170 check_script_fname = res[1]
173 check_script_fname = res[1]
171 script_name = File.basename(check_script_fname)
174 script_name = File.basename(check_script_fname)
172 check_wrapper_template = File.open(SCRIPT_DIR + "/templates/check_wrapper").read
175 check_wrapper_template = File.open(SCRIPT_DIR + "/templates/check_wrapper").read
173 check_wrapper = ERB.new(check_wrapper_template)
176 check_wrapper = ERB.new(check_wrapper_template)
174
177
175 check_file = File.open("#{problem_dir}/script/check","w")
178 check_file = File.open("#{problem_dir}/script/check","w")
176 check_file.puts check_wrapper.result binding
179 check_file.puts check_wrapper.result binding
177 check_file.close
180 check_file.close
178
181
179 File.chmod(0755,"#{problem_dir}/script/check")
182 File.chmod(0755,"#{problem_dir}/script/check")
180
183
181 FileUtils.cp("#{check_script_fname}", "#{problem_dir}/script/#{script_name}")
184 FileUtils.cp("#{check_script_fname}", "#{problem_dir}/script/#{script_name}")
182 else
185 else
183 if File.exists?(SCRIPT_DIR + "/templates/check.#{check_script}")
186 if File.exists?(SCRIPT_DIR + "/templates/check.#{check_script}")
184 check_script_fname = SCRIPT_DIR + "/templates/check.#{check_script}"
187 check_script_fname = SCRIPT_DIR + "/templates/check.#{check_script}"
185 else
188 else
186 check_script_fname = check_script
189 check_script_fname = check_script
187 end
190 end
188 FileUtils.cp("#{check_script_fname}", "#{problem_dir}/script/check", :preserve => true)
191 FileUtils.cp("#{check_script_fname}", "#{problem_dir}/script/check", :preserve => true)
189 end
192 end
190
193
191 # generating test_request directory
194 # generating test_request directory
192 puts "generating test_request template"
195 puts "generating test_request template"
193 FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/script")
196 FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/script")
194 FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/test_cases/1")
197 FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/test_cases/1")
195
198
196 template = File.open(SCRIPT_DIR + "/templates/test_request_all_tests.cfg.erb").read
199 template = File.open(SCRIPT_DIR + "/templates/test_request_all_tests.cfg.erb").read
197 test_request_all_test_cfg = ERB.new(template)
200 test_request_all_test_cfg = ERB.new(template)
198
201
199 cfg_file = File.open("#{ev_dir}/test_request/#{problem}/test_cases/all_tests.cfg","w")
202 cfg_file = File.open("#{ev_dir}/test_request/#{problem}/test_cases/all_tests.cfg","w")
200 cfg_file.puts test_request_all_test_cfg.result
203 cfg_file.puts test_request_all_test_cfg.result
201 cfg_file.close
204 cfg_file.close
202
205
203 FileUtils.cp("#{SCRIPT_DIR}/templates/check_empty",
206 FileUtils.cp("#{SCRIPT_DIR}/templates/check_empty",
204 "#{ev_dir}/test_request/#{problem}/script/check")
207 "#{ev_dir}/test_request/#{problem}/script/check")
205 FileUtils.cp("#{SCRIPT_DIR}/templates/answer-1.txt",
208 FileUtils.cp("#{SCRIPT_DIR}/templates/answer-1.txt",
206 "#{ev_dir}/test_request/#{problem}/test_cases/1")
209 "#{ev_dir}/test_request/#{problem}/test_cases/1")
207
210
208 puts "done"
211 puts "done"
209 end
212 end
210
213
211
214
212 SCRIPT_DIR = File.dirname(__FILE__)
215 SCRIPT_DIR = File.dirname(__FILE__)
213
216
214 # print usage
217 # print usage
215 if (ARGV.length < 3) or (ARGV[2][0,1]=="-")
218 if (ARGV.length < 3) or (ARGV[2][0,1]=="-")
216 print_usage
219 print_usage
217 exit(127)
220 exit(127)
218 end
221 end
219
222
220 # processing arguments
223 # processing arguments
221 problem = ARGV[0]
224 problem = ARGV[0]
222 testcase_dir = ARGV[1]
225 testcase_dir = ARGV[1]
223 problem = File.basename(testcase_dir) if problem=="-"
226 problem = File.basename(testcase_dir) if problem=="-"
224 check_script = ARGV[2]
227 check_script = ARGV[2]
225 options = {:time_limit => 1, :mem_limit => 16}
228 options = {:time_limit => 1, :mem_limit => 16}
226 process_options(options)
229 process_options(options)
227
230
228 JUDGE_ENVIRONMENTS.each do |env|
231 JUDGE_ENVIRONMENTS.each do |env|
@@ -1,85 +1,88
1 #!/usr/bin/env ruby
1 #!/usr/bin/env ruby
2
2
3 def config
3 def config
4 Grader::Configuration.get_instance
4 Grader::Configuration.get_instance
5 end
5 end
6
6
7 def display_manual
7 def display_manual
8 puts <<USAGE
8 puts <<USAGE
9 load_testcases
9 load_testcases
10 using: load_testcases [problem_name ...]
10 using: load_testcases [problem_name ...]
11 problem_name are list of "short name" of the problems
11 problem_name are list of "short name" of the problems
12
12
13 options:
13 options:
14 --dry-run do nothing, just simulate the run
14 --dry-run do nothing, just simulate the run
15 --all import all problem. This might take several minutes
15 --all import all problem. This might take several minutes
16
16
17 USAGE
17 USAGE
18 end
18 end
19
19
20 def process_options_and_stop_file
20 def process_options_and_stop_file
21
21
22 # Process 'help' option
22 # Process 'help' option
23 if (ARGV.length == 0) or ((ARGV.length==1) and (/help/.match(ARGV[0])))
23 if (ARGV.length == 0) or ((ARGV.length==1) and (/help/.match(ARGV[0])))
24 display_manual
24 display_manual
25 exit(0)
25 exit(0)
26 end
26 end
27
27
28 #default options
28 #default options
29 options = {
29 options = {
30 :dry_run => false,
30 :dry_run => false,
31 }
31 }
32
32
33 options[:dry_run] = (ARGV.delete('--dry') != nil)
33 options[:dry_run] = (ARGV.delete('--dry') != nil)
34 options[:all] = (ARGV.delete('--all') != nil)
34 options[:all] = (ARGV.delete('--all') != nil)
35
35
36 return options
36 return options
37 end
37 end
38
38
39 def process_problem(prob,dry_run = false)
39 def process_problem(prob,dry_run = false)
40 prob.testcases.destroy_all
40 prob.testcases.destroy_all
41 testcases_root = File.expand_path(GRADER_ROOT+"/../ev/#{prob.name}/test_cases/")
41 testcases_root = File.expand_path(GRADER_ROOT+"/../ev/#{prob.name}/test_cases/")
42 num = 1
42 num = 1
43 puts "Processing problem #{prob.name}"
43 puts "Processing problem #{prob.name}"
44 loop do
44 loop do
45 file_root = testcases_root + "/#{num}/"
45 file_root = testcases_root + "/#{num}/"
46 puts " checking file #{file_root}"
46 puts " checking file #{file_root}"
47 break unless File.exists? file_root
47 break unless File.exists? file_root
48 input = File.read(file_root + "/input-#{num}.txt")
48 input = File.read(file_root + "/input-#{num}.txt")
49 answer = File.read(file_root + "/answer-#{num}.txt")
49 answer = File.read(file_root + "/answer-#{num}.txt")
50 + #we also remove carraige return
51 + input.gsub!(/\r\n?/,"\n")
52 + answer.gsub!(/\r\n?/,"\n")
50 puts " got test case ##{num} of size #{input.size} and #{answer.size}"
53 puts " got test case ##{num} of size #{input.size} and #{answer.size}"
51
54
52 #THIS IS JUST A PLACE HOLDER
55 #THIS IS JUST A PLACE HOLDER
53 group = num #this is wrong!!! fix it!!
56 group = num #this is wrong!!! fix it!!
54 score = 10
57 score = 10
55 #BEWARE
58 #BEWARE
56
59
57 prob.testcases.create(input: input,sol: answer, num: num, score:score,group: group) unless dry_run
60 prob.testcases.create(input: input,sol: answer, num: num, score:score,group: group) unless dry_run
58 num += 1
61 num += 1
59 end
62 end
60 end
63 end
61
64
62 #########################################
65 #########################################
63 # main program
66 # main program
64 #########################################
67 #########################################
65
68
66 options = process_options_and_stop_file
69 options = process_options_and_stop_file
67
70
68 # load grader environment
71 # load grader environment
69 GRADER_ENV = 'grading'
72 GRADER_ENV = 'grading'
70 require File.join(File.dirname(__FILE__),'config/environment')
73 require File.join(File.dirname(__FILE__),'config/environment')
71
74
72 # boot rails, to be able to use the active record
75 # boot rails, to be able to use the active record
73 RAILS_ENV = config.rails_env
76 RAILS_ENV = config.rails_env
74 require RAILS_ROOT + '/config/environment'
77 require RAILS_ROOT + '/config/environment'
75
78
76 if options[:all]
79 if options[:all]
77 Problem.all.each { |prob| process_problem(prob,options[:dry_run]) }
80 Problem.all.each { |prob| process_problem(prob,options[:dry_run]) }
78 else
81 else
79 ARGV.each do |name|
82 ARGV.each do |name|
80 prob = Problem.find_by(name: name)
83 prob = Problem.find_by(name: name)
81 process_problem(prob,options[:dry_run]) if prob
84 process_problem(prob,options[:dry_run]) if prob
82 puts "Cannot find the problem #{name}" unless prob
85 puts "Cannot find the problem #{name}" unless prob
83 end
86 end
84 end
87 end
85
88
You need to be logged in to leave comments. Login now