at_coder_friends 0.6.9 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -1
  3. data/.github/workflows/ruby.yml +7 -1
  4. data/.gitignore +3 -0
  5. data/.rubocop.yml +1 -1
  6. data/CHANGELOG.md +17 -4
  7. data/Gemfile.lock +37 -40
  8. data/README.md +10 -91
  9. data/at_coder_friends.gemspec +2 -2
  10. data/lib/at_coder_friends/cli.rb +13 -28
  11. data/lib/at_coder_friends/config_loader.rb +1 -2
  12. data/lib/at_coder_friends/generator/any_builtin.rb +22 -0
  13. data/lib/at_coder_friends/generator/base.rb +55 -6
  14. data/lib/at_coder_friends/generator/c_builtin.rb +22 -0
  15. data/lib/at_coder_friends/generator/cxx_builtin.rb +8 -239
  16. data/lib/at_coder_friends/generator/fragment.rb +106 -0
  17. data/lib/at_coder_friends/generator/main.rb +14 -6
  18. data/lib/at_coder_friends/generator/ruby_builtin.rb +13 -165
  19. data/lib/at_coder_friends/parser/binary.rb +9 -3
  20. data/lib/at_coder_friends/parser/constraints.rb +8 -8
  21. data/lib/at_coder_friends/parser/input_format.rb +5 -5
  22. data/lib/at_coder_friends/path_util.rb +1 -1
  23. data/lib/at_coder_friends/problem.rb +4 -4
  24. data/lib/at_coder_friends/scraping/session.rb +1 -1
  25. data/lib/at_coder_friends/scraping/tasks.rb +1 -1
  26. data/lib/at_coder_friends/version.rb +1 -1
  27. data/lib/at_coder_friends.rb +3 -0
  28. data/templates/any_builtin.md.erb +30 -0
  29. data/templates/any_builtin_fragments.yml +5 -0
  30. data/templates/c_builtin.c.erb +36 -0
  31. data/templates/c_builtin_fragments.yml +127 -0
  32. data/templates/csharp_sample.cs.erb +29 -0
  33. data/templates/csharp_sample_fragments.yml +159 -0
  34. data/templates/java_sample.java.erb +25 -0
  35. data/templates/java_sample_fragments.yml +98 -0
  36. data/templates/ruby_builtin_fragments.yml +93 -0
  37. metadata +22 -6
  38. data/.travis.yml +0 -16
  39. data/docs/CONFIGURATION.md +0 -421
@@ -4,7 +4,7 @@ module AtCoderFriends
4
4
  # Common methods and behaviors for dealing with paths.
5
5
  module PathUtil
6
6
  def makedirs_unless(dir)
7
- FileUtils.makedirs(dir) unless Dir.exist?(dir)
7
+ FileUtils.makedirs(dir)
8
8
  end
9
9
  end
10
10
  end
@@ -77,8 +77,8 @@ module AtCoderFriends
77
77
  ),
78
78
  self.class.new(
79
79
  container: :matrix, item: @item,
80
- names: names[-1..-1], size: size,
81
- delim: delim, cols: cols[-1..-1] || []
80
+ names: names[-1..], size: size,
81
+ delim: delim, cols: cols[-1..] || []
82
82
  )
83
83
  ]
84
84
  end
@@ -92,8 +92,8 @@ module AtCoderFriends
92
92
  ),
93
93
  self.class.new(
94
94
  container: :varray,
95
- names: names[1..-1], size: size[0..0],
96
- delim: delim, cols: cols[1..-1] || []
95
+ names: names[1..], size: size[0..0],
96
+ delim: delim, cols: cols[1..] || []
97
97
  )
98
98
  ]
99
99
  end
@@ -14,7 +14,7 @@ module AtCoderFriends
14
14
 
15
15
  def save_session
16
16
  dir = File.dirname(session_store)
17
- Dir.mkdir(dir) unless Dir.exist?(dir)
17
+ FileUtils.mkdir_p(dir)
18
18
  agent.cookie_jar.save_as(session_store)
19
19
  end
20
20
 
@@ -11,7 +11,7 @@ module AtCoderFriends
11
11
  yield pbm if block_given?
12
12
  pbm
13
13
  rescue StandardError => e
14
- puts e.to_s
14
+ puts e
15
15
  puts e.backtrace
16
16
  end
17
17
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AtCoderFriends
4
- VERSION = '0.6.9'
4
+ VERSION = '0.7.0'
5
5
  end
@@ -28,6 +28,9 @@ require 'at_coder_friends/parser/interactive'
28
28
  require 'at_coder_friends/parser/binary'
29
29
  require 'at_coder_friends/parser/main'
30
30
  require 'at_coder_friends/generator/base'
31
+ require 'at_coder_friends/generator/fragment'
32
+ require 'at_coder_friends/generator/any_builtin'
33
+ require 'at_coder_friends/generator/c_builtin'
31
34
  require 'at_coder_friends/generator/cxx_builtin'
32
35
  require 'at_coder_friends/generator/ruby_builtin'
33
36
  require 'at_coder_friends/generator/main'
@@ -0,0 +1,30 @@
1
+ AnyBuiltin Generator
2
+ ====================
3
+
4
+ ## Usage
5
+ - Prepare a source template file.
6
+ - Specify the path to the template file
7
+ and file extension for the generated file (here we use 'js')
8
+ in `.at_coder_friends.yml` as follows:
9
+
10
+ ```
11
+ generators:
12
+ - AnyBuiltin
13
+ generator_settings:
14
+ AnyBuiltin:
15
+ file_ext: js
16
+ template: /path/to/template
17
+ ```
18
+
19
+ ## Problem URL
20
+ <%= pbm.url %>
21
+
22
+ ## Constants
23
+ <% gen_consts.each do |line| -%>
24
+ - [<%= line %>]
25
+ <% end -%>
26
+
27
+ ## Variables
28
+ <% gen_decls.each do |line| -%>
29
+ - [<%= line %>]
30
+ <% end -%>
@@ -0,0 +1,5 @@
1
+ constant:
2
+ mod: type=<%= type %> name=<%= name %> value=<%= value %>
3
+ max: type=<%= type %> name=<%= name %> value=<%= value %>
4
+ declaration:
5
+ main: <%= to_s %>
@@ -0,0 +1,36 @@
1
+ // <%= pbm.url %>
2
+
3
+ #include <stdio.h>
4
+
5
+ #define REP(i,n) for(int i=0; i<(int)(n); i++)
6
+ #define FOR(i,b,e) for(int i=(b); i<=(int)(e); i++)
7
+
8
+ <% gen_consts.each do |line| -%>
9
+ <%= line %>
10
+ <% end -%>
11
+
12
+ <% gen_decls.each do |line| -%>
13
+ <%= line %>
14
+ <% end -%>
15
+
16
+ void solve() {
17
+ <% if (vs = pbm.options.binary_values) -%>
18
+ int cond = 0;
19
+ puts(cond ? "<%= vs[0] %>" : "<%= vs[1] %>");
20
+ <% else -%>
21
+ int ans = 0;
22
+ printf("%d\n", ans);
23
+ <% end -%>
24
+ }
25
+
26
+ void input() {
27
+ <% gen_inputs.each do |line| -%>
28
+ <%= line %>
29
+ <% end -%>
30
+ }
31
+
32
+ int main() {
33
+ input();
34
+ solve();
35
+ return 0;
36
+ }
@@ -0,0 +1,127 @@
1
+ constant:
2
+ value_print: <%= value.sub(/\b10\^/, '(int)1e').sub(/\b2\^/, '1<<').gsub(',', '') %>
3
+ max: '#define <%= name.upcase %>_MAX <%= value_print %>'
4
+ mod: '#define MOD <%= value_print %>'
5
+ cxx_constant:
6
+ value_print: <%= value.sub(/\b10\^/, '1e').sub(/\b2\^/, '1<<').gsub(',', "'") %>
7
+ max: const int <%= name.upcase %>_MAX = <%= value_print %>;
8
+ mod: const int MOD = <%= value_print %>;
9
+ declaration:
10
+ type:
11
+ __key: [item]
12
+ number: int
13
+ decimal: double
14
+ string: char
15
+ char: char
16
+ horizontal_type: |
17
+ <%
18
+ case container
19
+ when :single
20
+ items = vars.map(&:item)
21
+ if items.uniq.size == 1 && items[0] != :string
22
+ %>multi<%
23
+ else
24
+ %>single<%
25
+ end
26
+ when :harray, :varray
27
+ %>array<%
28
+ else # :matrix, :vmatrix, :hmatrix
29
+ %>matrix<%
30
+ end
31
+ -%>
32
+ arr_sz1: <%= sz1.gsub(/([a-z][a-z0-9_]*)/i, '\1_MAX').upcase%>
33
+ arr_sz2: <%= sz2.gsub(/([a-z][a-z0-9_]*)/i, '\1_MAX').upcase%>
34
+ arr_sz: <%= arr_sz1 %>
35
+ null_alloc: <% if item == :char %> + 1<% end %>
36
+ string_alloc: <% if item == :string %>[<%= v.upcase %>_MAX + 1]<% end %>
37
+ line:
38
+ __key: [horizontal_type]
39
+ single: <%= type %> <%= v %><%= string_alloc %>;
40
+ multi: <%= type(vars[0].item) %> <%= vs.join(', ') %>;
41
+ array: <%= type %> <%= v %>[<%= arr_sz %><%= null_alloc %>]<%= string_alloc %>;
42
+ matrix: <%= type %> <%= v %>[<%= arr_sz1 %>][<%= arr_sz2 %><%= null_alloc %>]<%= string_alloc %>;
43
+ vertical_type: |
44
+ <%
45
+ if components
46
+ %>combi<%
47
+ else
48
+ case container
49
+ when :single
50
+ items = vars.map(&:item)
51
+ if items.uniq.size == 1 && items[0] != :string
52
+ %>single<%
53
+ else
54
+ %>multi<%
55
+ end
56
+ when :harray
57
+ %>single<%
58
+ else # :varray. :matrix, :vmatrix, :hmatrix
59
+ %>multi<%
60
+ end
61
+ end
62
+ -%>
63
+ main:
64
+ __key: [vertical_type]
65
+ single: <%= line %>
66
+ multi: |
67
+ <% vars.each do |var| -%>
68
+ <%= var.line %>
69
+ <% end -%>
70
+ combi: <% components.each do |cmp| %><%= cmp.main %><% end %>
71
+ input:
72
+ item_format:
73
+ __key: [item]
74
+ number: '%d'
75
+ decimal: '%lf'
76
+ string: '%s'
77
+ char: '%s'
78
+ line_format: <%= vars.map { |var| var.item_format }.join %>
79
+ address_type: <%= ['single', 'array', 'matrix'][size.size] %>
80
+ item_address:
81
+ __key: [address_type, item]
82
+ single:
83
+ number: '&<%= v %>'
84
+ decimal: '&<%= v %>'
85
+ string: <%= v %>
86
+ array:
87
+ number: <%= v %> + i
88
+ decimal: <%= v %> + i
89
+ string: <%= v %>[i]
90
+ char: <%= v %>
91
+ matrix:
92
+ number: '&<%= v %>[i][j]'
93
+ decimal: '&<%= v %>[i][j]'
94
+ string: <%= v %>[i][j]
95
+ char: <%= v %>[i]
96
+ line_address: <%= vars.map { |var| var.item_address }.join(', ') %>
97
+ input_type: <% if components %><%= container.to_s %><% else %>plain<% end %>
98
+ dim_type: '<%= size.size - (item == :char ? 1 : 0) %>_dim'
99
+ sz2_body: <%= sz2.split('_')[0] %>
100
+ main:
101
+ __key: [input_type, dim_type]
102
+ plain:
103
+ 0_dim: scanf("<%= line_format %>", <%= line_address %>);
104
+ 1_dim: REP(i, <%= sz1 %>) scanf("<%= line_format %>", <%= line_address %>);
105
+ 2_dim: REP(i, <%= sz1 %>) REP(j, <%= sz2 %>) scanf("<%= line_format %>", <%= line_address %>);
106
+ varray_matrix:
107
+ 1_dim: |
108
+ REP(i, <%= sz1 %>) {
109
+ scanf("<%= components[0].line_format %>", <%= components[0].line_address %>);
110
+ scanf("<%= components[1].line_format %>", <%= components[1].line_address %>);
111
+ }
112
+ 2_dim: |
113
+ REP(i, <%= sz1 %>) {
114
+ scanf("<%= components[0].line_format %>", <%= components[0].line_address %>);
115
+ REP(j, <%= sz2_body %>[i]) scanf("<%= components[1].line_format %>", <%= components[1].line_address %>);
116
+ }
117
+ matrix_varray:
118
+ 1_dim: |
119
+ REP(i, <%= sz1 %>) {
120
+ scanf("<%= components[0].line_format %>", <%= components[0].line_address %>);
121
+ scanf("<%= components[1].line_format %>", <%= components[1].line_address %>);
122
+ }
123
+ 2_dim: |
124
+ REP(i, <%= sz1 %>) {
125
+ REP(j, <%= sz2_body %>) scanf("<%= components[0].line_format %>", <%= components[0].line_address %>);
126
+ scanf("<%= components[1].line_format %>", <%= components[1].line_address %>);
127
+ }
@@ -0,0 +1,29 @@
1
+ // <%= pbm.url %>
2
+
3
+ using System;
4
+ using System.Collections;
5
+ using System.Collections.Generic;
6
+ using System.Linq;
7
+ using System.Text;
8
+
9
+ class Program
10
+ {
11
+ static void Main(string[] args)
12
+ {
13
+ <% gen_consts.each do |line| -%>
14
+ <%= line %>
15
+ <% end -%>
16
+
17
+ <% gen_decls.each do |line| -%>
18
+ <%= line %>
19
+ <% end -%>
20
+
21
+ <% if (vs = pbm.options.binary_values) -%>
22
+ bool cond = false;
23
+ Console.WriteLine(cond ? "<%= vs[0] %>" : "<%= vs[1] %>");
24
+ <% else -%>
25
+ int ans = 0;
26
+ Console.WriteLine(ans);
27
+ <% end -%>
28
+ }
29
+ }
@@ -0,0 +1,159 @@
1
+ constant:
2
+ value_print: <%= value.sub(/\b10\^/, '(int)1e').sub(/\b2\^/, '1<<').gsub(',', '_') %>
3
+ max: const int <%= name.upcase %>_MAX = <%= value_print %>;
4
+ mod: const int MOD = <%= value_print %>;
5
+ declaration:
6
+ read: Console.ReadLine()<% delims.each do |d| %>.Replace('<%= d %>', ' ')<% end %>
7
+ multiplicity: |
8
+ <%
9
+ case container
10
+ when :single, :varray
11
+ if vs.size > 1 && item != :char
12
+ %>multi<%
13
+ else
14
+ %>single<%
15
+ end
16
+ when :harray, :matrix
17
+ if item != :char
18
+ %>multi<%
19
+ else
20
+ %>single<%
21
+ end
22
+ else
23
+ %>multi<%
24
+ end
25
+ -%>
26
+ input:
27
+ __key: [item, multiplicity]
28
+ number:
29
+ single: int.Parse(<%= read %>)
30
+ multi: <%= read %>.Split().Select(int.Parse).ToArray()
31
+ decimal:
32
+ single: double.Parse(<%= read %>)
33
+ multi: <%= read %>.Split().Select(double.Parse).ToArray()
34
+ string:
35
+ single: <%= read %>
36
+ multi: <%= read %>.Split()
37
+ char:
38
+ single: <%= read %>
39
+ multi: <%= read %>.Split()
40
+ decl_type: |
41
+ <%
42
+ case container
43
+ when :single
44
+ if vs.size > 1 %>single_n<% else %>single_1<% end
45
+ when :varray
46
+ if vs.size > 1 %>varray_n<% else %>varray_1<% end
47
+ when :varray_matrix
48
+ if item == :char %>varray_matrix_1<% else %>varray_matrix_2<% end
49
+ else
50
+ %><%= container.to_s %><%
51
+ end
52
+ -%>
53
+ type_name:
54
+ __key: [item]
55
+ number: int
56
+ decimal: double
57
+ string: string
58
+ char: string
59
+ dim_type: '<%= size.size - (item == :char ? 1 : 0) %>_dim'
60
+ type_dim:
61
+ __key: [dim_type]
62
+ 0_dim: ''
63
+ 1_dim: '[]'
64
+ 2_dim: '[][]'
65
+ type: <%= type_name %><%= type_dim %>
66
+ line_buf: <%= vs.join() %>
67
+ arr_cnt: <%= vs.size - 1 %>
68
+ main:
69
+ __key: [decl_type]
70
+ single_1: <%= type %> <%= v %> = <%= input %>;
71
+ single_n: |
72
+ <%= type_name %>[] <%= line_buf %> = <%= input %>;
73
+ <% vs.each.with_index do |v, k| -%>
74
+ <%= type %> <%= v %> = <%= line_buf %>[<%= k %>];
75
+ <% end -%>
76
+ harray: <%= type %> <%= v %> = <%= input %>;
77
+ varray_1: <%= type %> <%= v %> = Enumerable.Range(0, <%= sz %>).Select(_ => <%= input %>).ToArray();
78
+ varray_n: |
79
+ <% vs.each do |v| -%>
80
+ <%= type %> <%= v %> = new <%= type_name %>[<%= sz %>];
81
+ <% end -%>
82
+ for (int i = 0; i < <%= sz %>; i++)
83
+ {
84
+ <%= type_name %>[] <%= line_buf %> = <%= input %>;
85
+ <% vs.each.with_index do |v, k| -%>
86
+ <%= v %>[i] = <%= line_buf %>[<%= k %>];
87
+ <% end -%>
88
+ }
89
+ matrix: |
90
+ <%= type %> <%= v %> = Enumerable.Range(0, <%= sz %>).Select(_ =>
91
+ <%= input %>
92
+ ).ToArray();
93
+ varray_matrix_1: |
94
+ <% vs[0..-2].each do |v| -%>
95
+ <%= type_name %>[] <%= v %> = new <%= type_name %>[<%= sz %>];
96
+ <% end -%>
97
+ <%= type_name %>[] <%= vs[-1] %> = new <%= type_name %>[<%= sz %>];
98
+ for (int i = 0; i < <%= sz %>; i++)
99
+ {
100
+ <%= type_name %>[] <%= line_buf %> = <%= input %>;
101
+ <% vs[0..-2].each.with_index do |v, k| -%>
102
+ <%= v %>[i] = <%= line_buf %>[<%= k %>];
103
+ <% end -%>
104
+ <%= vs[-1] %>[i] = <%= line_buf %>.Last();
105
+ }
106
+ varray_matrix_2: |
107
+ <% vs[0..-2].each do |v| -%>
108
+ <%= type_name %>[] <%= v %> = new <%= type_name %>[<%= sz %>];
109
+ <% end -%>
110
+ <%= type_name %>[][] <%= vs[-1] %> = new <%= type_name %>[<%= sz %>][];
111
+ for (int i = 0; i < <%= sz %>; i++)
112
+ {
113
+ <%= type_name %>[] <%= line_buf %> = <%= input %>;
114
+ <% vs[0..-2].each.with_index do |v, k| -%>
115
+ <%= v %>[i] = <%= line_buf %>[<%= k %>];
116
+ <% end -%>
117
+ <%= vs[-1] %>[i] = <%= line_buf %>.Skip(<%= arr_cnt %>).ToArray();
118
+ }
119
+ matrix_varray: |
120
+ <%= type_name %>[][] <%= vs[0] %> = new <%= type_name %>[<%= sz %>][];
121
+ <% vs[1..].each do |v| -%>
122
+ <%= type_name %>[] <%= v %> = new <%= type_name %>[<%= sz %>];
123
+ <% end -%>
124
+ for (int i = 0; i < <%= sz %>; i++)
125
+ {
126
+ <%= type_name %>[] <%= line_buf %> = <%= input %>;
127
+ <%= vs[0] %>[i] = <%= line_buf %>.Take(<%= line_buf %>.Count - <%= arr_cnt %>).ToArray();
128
+ <% vs[1..].each.with_index do |v, k| -%>
129
+ <%= v %>[i] = <%= line_buf %>[<%= line_buf %>.Count - <%= arr_cnt.to_i - k %>];
130
+ <% end -%>
131
+ }
132
+ vmatrix: |
133
+ <% vs.each do |v| -%>
134
+ <%= type %> <%= v %> = new <%= type_name %>[<%= sz1 %>][<%= sz2 %>];
135
+ <% end -%>
136
+ for (int i = 0; i < <%= sz1 %>; i++)
137
+ {
138
+ for (int j = 0; j < <%= sz2 %>; j++)
139
+ {
140
+ <%= type_name %>[] <%= line_buf %> = <%= input %>;
141
+ <% vs.each.with_index do |v, k| -%>
142
+ <%= v %>[i][j] = <%= line_buf %>[<%= k %>];
143
+ <% end -%>
144
+ }
145
+ }
146
+ hmatrix: |
147
+ <% vs.each do |v| -%>
148
+ <%= type %> <%= v %> = new <%= type_name %>[<%= sz1 %>][<%= sz2 %>];
149
+ <% end -%>
150
+ for (int i = 0; i < <%= sz1 %>; i++)
151
+ {
152
+ <%= type_name %>[] <%= line_buf %> = <%= input %>;
153
+ for (int j = 0; j < <%= sz2 %>; j++)
154
+ {
155
+ <% vs.each.with_index do |v, k| -%>
156
+ <%= v %>[i][j] = <%= line_buf %>[j * <%= vs.size %> + <%= k %>];
157
+ <% end -%>
158
+ }
159
+ }
@@ -0,0 +1,25 @@
1
+ // <%= pbm.url %>
2
+
3
+ import java.util.*;
4
+
5
+ public class Main {
6
+
7
+ <% gen_consts.each do |line| -%>
8
+ <%= line %>
9
+ <% end -%>
10
+
11
+ public static void main(String[] args) {
12
+ Scanner sc = new Scanner(System.in);
13
+ <% gen_decls.each do |line| -%>
14
+ <%= line %>
15
+ <% end -%>
16
+
17
+ <% if (vs = pbm.options.binary_values) -%>
18
+ boolean cond = false;
19
+ System.out.println(cond ? "<%= vs[0] %>" : "<%= vs[1] %>");
20
+ <% else -%>
21
+ int ans = 0;
22
+ System.out.println(ans);
23
+ <% end -%>
24
+ }
25
+ }
@@ -0,0 +1,98 @@
1
+ constant:
2
+ value_print: <%= value.sub(/\b10\^/, '(int)1e').sub(/\b2\^/, '1<<').gsub(',', '_') %>
3
+ max: 'public static final int <%= name.upcase %>_MAX = <%= value_print %>;'
4
+ mod: 'public static final int MOD = <%= value_print %>;'
5
+ declaration:
6
+ type_name:
7
+ __key: [item]
8
+ number: int
9
+ decimal: double
10
+ string: String
11
+ char: char
12
+ type_dim: <% if item == :char %>[]<% else %><% end %>
13
+ type: <%= type_name %><%= type_dim %>
14
+ read:
15
+ __key: [item]
16
+ number: sc.nextInt()
17
+ decimal: sc.nextDouble()
18
+ string: sc.next()
19
+ char: sc.next().toCharArray()
20
+ dim_type: '<%= size.size - (item == :char ? 1 : 0) %>_dim'
21
+ decl_line:
22
+ __key: [dim_type]
23
+ 0_dim: <%= type %> <%= v %> = <%= read %>;
24
+ 1_dim: <%= type %>[] <%= v %> = new <%= type_name %>[<%= sz %>]<%= type_dim %>;
25
+ 2_dim: <%= type %>[][] <%= v %> = new <%= type %>[<%= sz1 %>][<%= sz2 %>];
26
+ jagged_array_decl: <%= type_name %>[][] <%= v %> = new <%= type_name %>[<%= sz1 %>][];
27
+ input_line:
28
+ __key: [dim_type]
29
+ 1_dim: <%= v %>[i] = <%= read %>;
30
+ 2_dim: <%= v %>[i][j] = <%= read %>;
31
+ decl_type: <% if components %><%= container.to_s %><% else %>plain<% end %>
32
+ decl_block:
33
+ __key: [decl_type]
34
+ plain: |
35
+ <% vars.each do |var| -%>
36
+ <%= var.decl_line %>
37
+ <% end -%>
38
+ varray_matrix: |
39
+ <%= components[0].decl_block -%>
40
+ <%= components[1].jagged_array_decl %>
41
+ matrix_varray: <% components.each do |cmp| %><%= cmp.decl_block %><% end %>
42
+ input_type: <% if components %><%= container.to_s %><% else %>plain<% end %>
43
+ input_block:
44
+ __key: [input_type, dim_type]
45
+ plain:
46
+ 0_dim: ''
47
+ 1_dim: |
48
+ for (int i = 0; i < <%= sz %>; i++) {
49
+ <% vars.each do |var| -%>
50
+ <%= var.input_line %>
51
+ <% end -%>
52
+ }
53
+ 2_dim: |
54
+ for (int i = 0; i < <%= sz1 %>; i++) {
55
+ for (int j = 0; j < <%= sz2 %>; j++) {
56
+ <% vars.each do |var| -%>
57
+ <%= var.input_line %>
58
+ <% end -%>
59
+ }
60
+ }
61
+ varray_matrix:
62
+ 1_dim: |
63
+ for (int i = 0; i < <%= sz %>; i++) {
64
+ <% components[0].vars.each do |var| -%>
65
+ <%= var.input_line %>
66
+ <% end -%>
67
+ <%= components[1].input_line %>
68
+ }
69
+ 2_dim: |
70
+ for (int i = 0; i < <%= sz1 %>; i++) {
71
+ <% components[0].vars.each do |var| -%>
72
+ <%= var.input_line %>
73
+ <% end -%>
74
+ <% components[1].tap do |cmp| -%>
75
+ <%= cmp.v %>[i] = new <%= cmp.type %>[<%= v %>[i]];
76
+ <% end -%>
77
+ for (int j = 0; j < <%= v %>[i]; j++) {
78
+ <%= components[1].input_line %>
79
+ }
80
+ }
81
+ matrix_varray:
82
+ 1_dim: |
83
+ for (int i = 0; i < <%= sz %>; i++) {
84
+ <%= components[0].input_line %>
85
+ <% components[1].vars.each do |var| -%>
86
+ <%= var.input_line %>
87
+ <% end -%>
88
+ }
89
+ 2_dim: |
90
+ for (int i = 0; i < <%= sz1 %>; i++) {
91
+ for (int j = 0; j < <%= sz2 %>; j++) {
92
+ <%= components[0].input_line %>
93
+ }
94
+ <% components[1].vars.each do |var| -%>
95
+ <%= var.input_line %>
96
+ <% end -%>
97
+ }
98
+ main: <%= decl_block %><%= input_block %>
@@ -0,0 +1,93 @@
1
+ constant:
2
+ value_print: <%= value.gsub('^', '**').gsub(',', '_') %>
3
+ mod: MOD = <%= value_print %>
4
+ declaration:
5
+ read: gets<% delims.each do |d| %>.gsub('<%= d %>', ' ')<% end %>
6
+ multiplicity: |
7
+ <%
8
+ case container
9
+ when :single, :varray
10
+ if vs.size > 1 && item != :char
11
+ %>multi<%
12
+ else
13
+ %>single<%
14
+ end
15
+ when :harray, :matrix
16
+ if item != :char
17
+ %>multi<%
18
+ else
19
+ %>single<%
20
+ end
21
+ else
22
+ %>multi<%
23
+ end
24
+ -%>
25
+ input:
26
+ __key: [item, multiplicity]
27
+ number:
28
+ single: <%= read %>.to_i
29
+ multi: <%= read %>.split.map(&:to_i)
30
+ decimal:
31
+ single: <%= read %>.to_f
32
+ multi: <%= read %>.split.map(&:to_f)
33
+ string:
34
+ single: <%= read %>.chomp
35
+ multi: <%= read %>.chomp.split
36
+ char:
37
+ single: <%= read %>.chomp
38
+ multi: <%= read %>.chomp.split
39
+ decl_type: |
40
+ <%
41
+ case container
42
+ when :varray
43
+ if vs.size > 1 %>varray_n<% else %>varray_1<% end
44
+ else
45
+ %><%= container.to_s %><%
46
+ end
47
+ -%>
48
+ splat: <% unless item == :char %>*<% end %>
49
+ main:
50
+ __key: [decl_type]
51
+ single: <%= vs.join(', ') %> = <%= input %>
52
+ harray: <%= v %>s = <%= input %>
53
+ varray_1: <%= v %>s = Array.new(<%= sz %>) { <%= input %> }
54
+ varray_n: |
55
+ <% vs.each do |v| -%>
56
+ <%= v %>s = Array.new(<%= sz %>)
57
+ <% end -%>
58
+ <%= sz %>.times do |i|
59
+ <%= vs.map { |v| "#{v}s[i]" }.join(', ') %> = <%= input %>
60
+ end
61
+ matrix: <%= v %>ss = Array.new(<%= sz %>) { <%= input %> }
62
+ varray_matrix: |
63
+ <% vs[0..-2].each do |v| -%>
64
+ <%= v %>s = Array.new(<%= sz %>)
65
+ <% end -%>
66
+ <%= vs[-1] %>ss = Array.new(<%= sz %>)
67
+ <%= sz %>.times do |i|
68
+ <%= vs[0..-2].map { |v| "#{v}s[i]" }.join(', ') %>, <%= splat %><%= vs[-1] %>ss[i] = <%= input %>
69
+ end
70
+ matrix_varray: |
71
+ <%= vs[0] %>ss = Array.new(<%= sz %>)
72
+ <% vs[1..].each do |v| -%>
73
+ <%= v %>s = Array.new(<%= sz %>)
74
+ <% end -%>
75
+ <%= sz %>.times do |i|
76
+ <%= splat %><%= vs[0] %>ss[i], <%= vs[1..].map { |v| "#{v}s[i]" }.join(', ') %> = <%= input %>
77
+ end
78
+ vmatrix: |
79
+ <% vs.each do |v| -%>
80
+ <%= v %>ss = Array.new(<%= sz1 %>) { Array.new(<%= sz2 %>) }
81
+ <% end -%>
82
+ <%= sz1 %>.times do |i|
83
+ <%= sz2 %>.times do |j|
84
+ <%= vs.map { |v| "#{v}ss[i][j]" }.join(', ') %> = <%= input %>
85
+ end
86
+ end
87
+ hmatrix: |
88
+ <% vs.each do |v| -%>
89
+ <%= v %>ss = Array.new(<%= sz %>)
90
+ <% end -%>
91
+ <%= sz %>.times do |i|
92
+ <%= vs.map { |v| "#{v}ss[i]" }.join(', ') %> = <%= input %>.each_slice(<%= vs.size %>).to_a.transpose
93
+ end