atcoder_greedy 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8f2b89e384eba68f987b92e8834a0e34c9f22e5
4
- data.tar.gz: cd16013e2bd6e3277607904fea4922eda54948ed
3
+ metadata.gz: 02ce08f02c28c663958ba6d89dcac332515dce41
4
+ data.tar.gz: e685ca727b9bddf4d8ba65172b2ec56e8ccd3d36
5
5
  SHA512:
6
- metadata.gz: 86c4da3eacd3c8b5ae044a0373d6c2d14a68de51630214efd0ecbb2813d4057e697848617e19696c988b1652bc5bc184b1b768c32b56a1df7e3f8d67ff4f52de
7
- data.tar.gz: 0a899cf524a11805e2f0b5370fe8b18bf2987f73f01e9da31b6707fe4b0e9c03acb077e110b9318220e76ce127b956f7fec57da73cf6bc58134bf034b1403086
6
+ metadata.gz: 18d4b206ee22ea32e6d91f31d2c276d6b4f186714856b33b9a9980461eb8efa7beead044d553a1970bd97111aa645b9469dc1868dc3c2ff3a851240c5144e765
7
+ data.tar.gz: dccb6400815a5ed90d6da2c5bc4140c39c1e5998d4b888bbc43b20e8ea86fb129c31bb5f22aed638eff3987284d1fdb5cd5345b00ce7769215c69c669034e1aa
data/README.md CHANGED
@@ -7,63 +7,71 @@
7
7
 
8
8
  ## Usage
9
9
 
10
+ ### テンプレートファイルの作成
10
11
  ```
12
+ # create contest templates
11
13
  $ atcoder_greedy create CONTESTNAME
12
14
  ```
13
15
 
14
- example: ABC008の場合
16
+ ### テストの実行
17
+ ```
18
+ $ cd CONTESTNAME
19
+ $ atcoder_greedy test PROBLEMNAME
20
+ ```
21
+
22
+ ## 使用例
23
+ ABC009の場合
15
24
 
16
25
  ```
17
- $ atcoder_greedy create abc008
26
+ $ atcoder_greedy create abc009
18
27
  ```
19
28
 
20
29
  とすると、以下のようなファイルが生成される。
21
30
 
22
31
  ```
23
32
  .
24
- ├── abc008_1
25
- │   ├── abc008_1.rb
26
- │   ├── input.txt
27
- │   ├── output.txt
28
- │   └── test_abc008_1.rb
29
- ├── abc008_2
30
- │   ├── abc008_2.rb
31
- │   ├── input.txt
32
- │   ├── output.txt
33
- │   └── test_abc008_2.rb
34
- ├── abc008_3
35
- │   ├── abc008_3.rb
36
- │   ├── input.txt
37
- │   ├── output.txt
38
- │   └── test_abc008_3.rb
39
- └── abc008_4
40
- ├── abc008_4.rb
41
- ├── input.txt
42
- ├── output.txt
43
- └── test_abc008_4.rb
33
+ ├── A.rb
34
+ ├── B.rb
35
+ ├── C.rb
36
+ ├── D.rb
37
+ ├── input_A.txt
38
+ ├── input_B.txt
39
+ ├── input_C.txt
40
+ └── input_D.txt
44
41
  ```
45
42
 
46
- 各問題について,input.txtがインプット,output.txtがアウトプット,abc_00X_Y.rbが解答ファイル,test_abc_00X_Y.rbがテストファイルとなる。
43
+ 各問題について,X.rbに自分の解答を記述すれば良い。
44
+ input_X.txtにはX.rbのサンプルインプット,アウトプットが記載されている.
47
45
 
48
- abc00X_Y.rbのsolveメソッドに問題の解答を書く。
49
-
50
- テストを実行するには、
46
+ A問題についてテストを実行するには、
51
47
 
52
48
  ```
53
- $ cd abc00X_Y/
54
- $ ruby test_abc00X_Y.rb
49
+ $ atcoder_greedy test A.rb
55
50
  ```
56
51
 
57
- とすれば良い。
52
+ とすると、以下のようにテスト結果が表示される。
53
+
54
+ ```
55
+ Running a test for problem A...
56
+ Testcase #0 ... PASSED! Time: 0.04137948894640431s
57
+ Testcase #1 ... FAILED! Time: 0.051738745998591185s
58
+ Your Output:
59
+ 3
60
+
61
+ Correct Answer:
62
+ 2
63
+
64
+ Testcase #2 ... PASSED! Time: 0.05054747499525547s
65
+ Test done.
66
+ ```
58
67
 
59
68
  ## 実装した機能
69
+ - 解答ファイルのテンプレート生成
60
70
  - サンプルインプット、アウトプットを用いたテストファイルの生成
61
- - 解答のテンプレート生成
71
+ - テスト実行コマンド
62
72
 
63
73
 
64
74
  ## TODO,実装したい機能
65
- - リファクタリング
66
- - テスト結果を見やすく
67
75
  - 問題を指定してその問題のみ生成
68
76
  - 提出機能
69
77
  - 多言語もテンプレートから生成したい
@@ -4,17 +4,19 @@ require 'atcoder_greedy/command'
4
4
  module AtcoderGreedy
5
5
  class Command < Thor
6
6
  desc 'create CONTESTNAME', 'create contest templates for CONTESTNAME'
7
+
7
8
  def create(contest_name)
8
9
  Contest.new(contest_name.downcase)
9
10
  end
10
11
  end
11
12
 
12
13
  TEMPLATE_PATH = File.join(File.dirname(__dir__), '/templates')
13
- TEST_TEMPLATE = open(TEMPLATE_PATH + '/ruby/test.rb', &:read)
14
14
  SOLVE_TEMPLATE = open(TEMPLATE_PATH + '/ruby/solve.rb', &:read)
15
+ PROBLEM_NAMES = %w(A B C D)
15
16
 
16
17
  class Contest
17
18
  attr_accessor :name, :url
19
+
18
20
  def initialize(name)
19
21
  @name = name
20
22
  puts "Create #{name} contest files"
@@ -23,6 +25,7 @@ module AtcoderGreedy
23
25
  @problem_urls = create_contest_problem_urls(name)
24
26
  puts 'Create directories'
25
27
  create_directories
28
+ create_templates
26
29
  puts 'Set up done.'
27
30
  end
28
31
 
@@ -40,16 +43,14 @@ module AtcoderGreedy
40
43
  end
41
44
 
42
45
  4.times do |i|
43
- urls.push(name: "#{contest_name}_#{task_num[i]}", path: @base_url + "/tasks/#{contest_name}_#{task_num[i]}")
46
+ urls.push(name: "#{PROBLEM_NAMES[i]}", path: @base_url + "/tasks/#{contest_name}_#{task_num[i]}")
44
47
  end
45
48
  urls
46
49
  end
47
50
 
48
- def create_directories
49
- # コンテストディレクトリ作成
50
- FileUtils.mkdir(@name)
51
-
52
- @problem_urls.each do |url|
51
+ def create_templates
52
+ @problem_urls.each_with_index do |url, pro_i|
53
+ problem_dir = "./#{@name}"
53
54
  # urlからインプット、アウトプットパラメータをとってきてファイルにしまう
54
55
  charset = nil
55
56
  html = open(url[:path]) do |f|
@@ -57,40 +58,34 @@ module AtcoderGreedy
57
58
  f.read
58
59
  end
59
60
  doc = Nokogiri::HTML.parse(html, nil, charset)
60
-
61
- problem_dir = "./#{@name}/#{url[:name]}"
62
- FileUtils.mkdir(problem_dir)
63
-
64
- in_file = File.new(problem_dir + '/input.txt', 'w')
65
- out_file = File.new(problem_dir + '/output.txt', 'w')
61
+ in_file = File.new(problem_dir + "/input_#{PROBLEM_NAMES[pro_i]}.txt", 'w')
66
62
 
67
63
  params = doc.xpath('//pre')
68
64
  params.shift
69
65
  params.each_with_index do |p, i|
70
66
  if i % 2 == 0
71
- in_file.print "#{p.text}"
67
+ in_file.puts "-- Example #{i/2}"
68
+ in_file.puts "#{p.text.gsub(/\r\n?/, "\n").strip}"
72
69
  else
73
- out_file.print "#{p.text}"
70
+ in_file.puts "-- Answer #{(i-1)/2}"
71
+ in_file.puts "#{p.text.gsub(/\r\n?/, "\n").strip}"
74
72
  end
75
73
  end
76
74
 
77
75
  in_file.close
78
- out_file.close
79
-
80
- # テストファイル,解答ファイルの生成
81
- test_file_content = TEST_TEMPLATE.clone
82
- test_file_content.gsub!(/NAME/, url[:name].capitalize)
83
- test_file_content.gsub!(/PROBLEM/, url[:name])
84
- test_file = File.new(problem_dir + "/test_#{url[:name]}.rb", 'w')
85
- test_file.print test_file_content
86
- test_file.close
87
76
 
88
77
  solve_file_content = SOLVE_TEMPLATE.clone
89
- solve_file_content.gsub!(/NAME/, url[:name].capitalize)
78
+ solve_file_content.gsub!(/CONTEST/, @name.upcase)
79
+ solve_file_content.gsub!(/PROBLEM/, url[:name].upcase)
90
80
  solve_file = File.new(problem_dir + "/#{url[:name]}.rb", 'w')
91
81
  solve_file.print solve_file_content
92
82
  solve_file.close
93
83
  end
94
84
  end
85
+
86
+ def create_directories
87
+ # コンテストディレクトリ作成
88
+ FileUtils.mkdir(@name)
89
+ end
95
90
  end
96
- end
91
+ end
@@ -0,0 +1,84 @@
1
+ require 'atcoder_greedy'
2
+ require 'atcoder_greedy/command'
3
+ require 'diff/lcs'
4
+ require 'tempfile'
5
+ require 'benchmark'
6
+
7
+
8
+ module AtcoderGreedy
9
+ class Command < Thor
10
+ desc 'test PROBLEMNAME', 'test your solution'
11
+
12
+ def test(problem_name)
13
+ name = File.basename(problem_name, '.*')
14
+ puts "Running a test for problem #{name}..."
15
+ TestCase.new(name).validate
16
+ puts "Test done."
17
+ end
18
+ end
19
+
20
+ class TestCase
21
+ def initialize(problem_name)
22
+ @input_file = File.open("./input_#{problem_name}.txt", 'r')
23
+ @exec_file = "./#{problem_name}.rb"
24
+ get_in_out
25
+ end
26
+
27
+ def get_in_out
28
+ i = 0
29
+ @input = []
30
+ @output = []
31
+ now = nil
32
+ while (t = @input_file.gets) != nil
33
+ example_string = "-- Example #{i}"
34
+ answer_string = "-- Answer #{i}"
35
+
36
+ if t.chomp == example_string
37
+ now.close(false) unless now.nil?
38
+ now = Tempfile.new(['in', '.txt'], './')
39
+ @input.push(now)
40
+ now.open
41
+ elsif t.chomp == answer_string
42
+ now.close(false) unless now.nil?
43
+ now = Tempfile.new(['out', '.txt'], './')
44
+ @output.push(now)
45
+ now.open
46
+ i += 1
47
+ else
48
+ now.puts t
49
+ end
50
+ end
51
+ @input[-1].close(false)
52
+ @output[-1].close(false)
53
+ end
54
+
55
+ def validate
56
+ @input.size.times do |j|
57
+ myout_file = Tempfile.new(['myout', '.txt'], './')
58
+ myout_file.open
59
+ result = Benchmark.realtime do
60
+ pid = Process.fork do
61
+ exec "ruby #{@exec_file} < #{@input[j].path} > #{myout_file.path}"
62
+ @input[j].close
63
+ myout_file.close(false)
64
+ end
65
+ Process.waitpid pid
66
+ end
67
+
68
+ myout = myout_file.open.read
69
+ myout_file.close
70
+ correct = File.open("#{@output[j].path}").read
71
+ diffs = Diff::LCS.diff(myout, correct)
72
+ if diffs.size == 0
73
+ puts "Testcase ##{j} ... PASSED! Time: #{result}s"
74
+ else
75
+ puts "Testcase ##{j} ... FAILED! Time: #{result}s"
76
+ puts "Your Output:"
77
+ puts "#{myout}\n"
78
+ puts "Correct Answer:"
79
+ puts "#{correct}\n"
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -1,8 +1,9 @@
1
1
  require 'atcoder_greedy'
2
2
  require 'thor'
3
3
  require 'atcoder_greedy/command/create'
4
+ require 'atcoder_greedy/command/test'
4
5
 
5
6
  module AtcoderGreedy
6
7
  class Command < Thor
7
8
  end
8
- end
9
+ end
@@ -1,22 +1,2 @@
1
- # coding: utf-8
2
- require 'stringio'
3
-
4
- class NAME
5
- alias :puts_original :puts
6
- def initialize(input)
7
- @f = StringIO.new(input)
8
- end
9
-
10
- def gets
11
- @f.gets
12
- end
13
-
14
- def puts(a)
15
- puts_original a
16
- a
17
- end
18
-
19
- def solve
20
- # write your program here
21
- end
22
- end
1
+ # CONTEST PROBLEM
2
+ # Your code here
@@ -1,3 +1,3 @@
1
1
  module AtcoderGreedy
2
- VERSION = "0.1.1"
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atcoder_greedy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - keigo-brook
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-08 00:00:00.000000000 Z
11
+ date: 2016-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -104,8 +104,8 @@ files:
104
104
  - lib/atcoder_greedy.rb
105
105
  - lib/atcoder_greedy/command.rb
106
106
  - lib/atcoder_greedy/command/create.rb
107
+ - lib/atcoder_greedy/command/test.rb
107
108
  - lib/atcoder_greedy/templates/ruby/solve.rb
108
- - lib/atcoder_greedy/templates/ruby/test.rb
109
109
  - lib/atcoder_greedy/version.rb
110
110
  homepage: https://github.com/keigo-brook/atcoder_greedy
111
111
  licenses:
@@ -1,61 +0,0 @@
1
- # coding: utf-8
2
- require 'test/unit'
3
- require_relative 'PROBLEM.rb'
4
-
5
- class Test_NAME < Test::Unit::TestCase
6
- def setup
7
- @test_cases = create_test_cases
8
- @sample_outputs = get_outputs
9
- end
10
-
11
- def create_test_cases
12
- test_cases = []
13
- in_file = File.open('./input.txt', 'r+:utf-8')
14
- loop do
15
- s = ''
16
- loop do
17
- t = in_file.gets
18
- if t != nil && t.chomp.length > 0
19
- s += t
20
- else
21
- break
22
- end
23
- end
24
- if s.length == 0 && test_cases.size > 0
25
- break
26
- elsif s.length > 0
27
- test_case = NAME.new(s)
28
- test_cases.push(test_case)
29
- end
30
- end
31
- test_cases
32
- end
33
-
34
- def get_outputs
35
- outputs = []
36
- out_file = File.open('./output.txt', 'r+:utf-8')
37
- loop do
38
- s = ''
39
- loop do
40
- t = out_file.gets
41
- if t != nil && t.chomp.length > 0
42
- s += t
43
- else
44
- break
45
- end
46
- end
47
- if s.length == 0 && outputs.size > 0
48
- break
49
- elsif s.length > 0
50
- outputs.push(s.chomp)
51
- end
52
- end
53
- outputs
54
- end
55
-
56
- def test_PROBLEM
57
- @test_cases.each_with_index do |obj, i|
58
- assert_equal(@sample_outputs[i], obj.solve.to_s)
59
- end
60
- end
61
- end