回答編集履歴

1

バグ修正(追記)

2016/09/27 09:36

投稿

退会済みユーザー
test CHANGED
@@ -97,3 +97,147 @@
97
97
  }
98
98
 
99
99
  ```
100
+
101
+
102
+
103
+ ###バグ修正(追記)
104
+
105
+ バグを修正しました。仕様をよく読んでいなかったのが原因。
106
+
107
+
108
+
109
+ その前に、Bertrand Meyerの「契約による設計」に従い、事前条件チェックをちゃんとやります。
110
+
111
+
112
+
113
+ ```Java
114
+
115
+ if (args == null && args.length != 11) {
116
+
117
+ throw new IllegalArgumentException();
118
+
119
+ }
120
+
121
+ if (args[0] != 0 || args[10] != 0) {
122
+
123
+ throw new IllegalArgumentException();
124
+
125
+ }
126
+
127
+ ```
128
+
129
+
130
+
131
+ 数列の積を使ってパターンを判定するようにしました。
132
+
133
+
134
+
135
+ ```Java
136
+
137
+ static int check(int[] args) {
138
+
139
+
140
+
141
+ for (int i=0, cnt=0, prod=1, pos=-1; i<11; ++i) {
142
+
143
+ int value = args[i];
144
+
145
+ if (value == 0) {
146
+
147
+ if (cnt == 4) {
148
+
149
+ return pos;
150
+
151
+ }
152
+
153
+ cnt = 0;
154
+
155
+ prod = 1;
156
+
157
+ } else {
158
+
159
+ prod *= value;
160
+
161
+ cnt += (value == 2 && prod == 4) ? 11 : value;
162
+
163
+ pos = ((value == 2 || value == 4) ||
164
+
165
+ prod == 1 || (prod == 3 && value == 1)) ? i : pos;
166
+
167
+ }
168
+
169
+ }
170
+
171
+ return -1;
172
+
173
+
174
+
175
+ }
176
+
177
+ ```
178
+
179
+ このコードが良くないのは、強引なやり方をしていてよく分からないことと、仕様変更に弱いことです。
180
+
181
+
182
+
183
+ 正規表現を使う方が、仕様変更に強い(正規表現だけを変えれば良い)し、わかりやすいと思いましたので、掲載します。
184
+
185
+
186
+
187
+ ```Java
188
+
189
+
190
+
191
+ static final String SEQ_PATTERN =
192
+
193
+ "^.*0111(1)0|011(2)0|01(2)10|0(2)110|0(1)30|03(1)0|0(4)0.*$";
194
+
195
+
196
+
197
+ static int check(int[] args) {
198
+
199
+
200
+
201
+ StringBuilder buff = Arrays
202
+
203
+ .stream(args)
204
+
205
+ .collect(
206
+
207
+ StringBuilder::new,
208
+
209
+ (b,v) -> b.append(String.valueOf(v)),
210
+
211
+ (c,d) -> c.append(d)
212
+
213
+ );
214
+
215
+ String seq = new String(buff);
216
+
217
+ Matcher m = Pattern.compile(SEQ_PATTERN).matcher(seq);
218
+
219
+ if (m.find()) {
220
+
221
+ for (int i=1; i<=m.groupCount(); ++i) {
222
+
223
+ if (m.group(i) != null) {
224
+
225
+ return m.start(i);
226
+
227
+ }
228
+
229
+ }
230
+
231
+ }
232
+
233
+ return -1;
234
+
235
+ }
236
+
237
+
238
+
239
+ ```
240
+
241
+ 正規表現の書き方が悪いとか、ストリームAPIの使い方がよくないと思っています。しかし、仕様変更があってもコードを変更しなくても良いところが気に入っています。
242
+
243
+