回答編集履歴

10

テキスト修正

2015/06/07 13:19

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -316,7 +316,7 @@
316
316
 
317
317
  もう1つ、
318
318
 
319
- 「4桁の数字が2つあったときに、同じの数字が同じどうかを判定する方法」
319
+ 「4桁の数字が2つあったときに、同じの数字が一致しているかを判定する方法」
320
320
 
321
321
  を思いついたので、挙げておきますね。
322
322
 

9

テキスト修正

2015/06/07 13:19

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -368,7 +368,7 @@
368
368
 
369
369
   かつ、一番左の数字と左から5番目の数字が同じもの」
370
370
 
371
- というものになっています。
371
+ を表しています。
372
372
 
373
373
 
374
374
 
@@ -382,28 +382,30 @@
382
382
 
383
383
  (4) 同様に、aとbの百の位、十の位、一の位の数字が一致するかどうかを
384
384
 
385
- 判定するための、sに対する正規表現を作ることができるので、これら4つの
385
+ 判定するための、sに対する正規表現を、各々作ることができ、これら4つの
386
-
386
+
387
- 正規表現のうち、s にマッチするものの個数が、aとbとで数字が同じ桁の
387
+ 正規表現のうち、s にマッチするものの個数が、aとbとで数字が同じ桁の個数
388
-
388
+
389
- 個数になります。
389
+ になります。
390
-
391
-
392
-
390
+
391
+
392
+
393
+
394
+
393
- 以上、正規表現を使えばこんな感じにも書けますということで、
395
+ 正規表現の学習はれからかもしれませが、こんな感じにも
394
-
396
+
395
- 参考に留めて頂ければ幸いです。
397
+ 書けますということで、参考に留めて頂ければ幸いです。
398
+
399
+
400
+
401
+  
402
+
403
+  
404
+
405
+
406
+
407
+
408
+
409
+
396
410
 
397
411
 
398
-
399
-  
400
-
401
-  
402
-
403
-
404
-
405
-
406
-
407
-
408
-
409
-

8

テキスト追加

2015/06/07 13:17

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -154,7 +154,7 @@
154
154
 
155
155
  ---
156
156
 
157
- 追記します。
157
+ 追記(1)
158
158
 
159
159
 
160
160
 
@@ -216,7 +216,7 @@
216
216
 
217
217
  ---
218
218
 
219
- 再び追記します。
219
+ 追記(2)
220
220
 
221
221
 
222
222
 
@@ -305,3 +305,105 @@
305
305
  以上、参考になれば幸いです。
306
306
 
307
307
 
308
+
309
+ ---
310
+
311
+ 追記(3)
312
+
313
+
314
+
315
+
316
+
317
+ もう1つ、
318
+
319
+ 「4桁の数字が2つあったときに、同じ桁の数字が同じかどうかを判定する方法」
320
+
321
+ を思いついたので、挙げておきますね。
322
+
323
+
324
+
325
+ まず前提として、今回の場合、ランダム生成する4桁の数字は、各桁が
326
+
327
+ ans[i] = (int)(Math.random() * 9) + 1;
328
+
329
+ という作成のされ方をするので、どの桁も1以上9以下ですので、
330
+
331
+ 数字0を含まない4桁の整数として、aとbを検証の対象とします。
332
+
333
+
334
+
335
+ このとき、
336
+
337
+
338
+
339
+ (1) aとbを文字列として連結した文字列s を作成します。
340
+
341
+   たとえば、
342
+
343
+   a=1234, b=1784 なら、s="12341784" です。
344
+
345
+
346
+
347
+ (2)このように s を作ると、 a と b の千の位の数字が一致するか
348
+
349
+   どうかを判定するには、文字列 s の一番左の数字と、左から
350
+
351
+   5番目の数字が一致するかどうかを調べればよいことになります。
352
+
353
+
354
+
355
+ (3) 上記(2)を調べるには、文字列s が正規表現
356
+
357
+
358
+
359
+ **^([1-9])[1-9]{3}\1[1-9]{3}$**
360
+
361
+
362
+
363
+ にマッチするかどうかを調べればよいです。
364
+
365
+ この正規表現は、
366
+
367
+ 「1以上9以下の数字だけで構成された、長さ8の文字列で、
368
+
369
+  かつ、一番左の数字と左から5番目の数字が同じもの」
370
+
371
+ というものになっています。
372
+
373
+
374
+
375
+ たとえば、
376
+
377
+ - a=1234, b=1784 のときの s="12341784" はこの正規表現にマッチしますが、
378
+
379
+ - a=5678, b=9876 のときの s="56789876" はこの正規表現にマッチしません。
380
+
381
+
382
+
383
+ (4) 同様に、aとbの百の位、十の位、一の位の数字が一致するかどうかを
384
+
385
+ 判定するための、sに対する正規表現を作ることができるので、これら4つの
386
+
387
+ 正規表現のうち、s にマッチするものの個数が、aとbとで数字が同じ桁の
388
+
389
+ 個数になります。
390
+
391
+
392
+
393
+ 以上、正規表現を使えばこんな感じにも書けますということで、
394
+
395
+ 参考に留めて頂ければ幸いです。
396
+
397
+
398
+
399
+  
400
+
401
+  
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+

7

テキスト追加

2015/06/07 13:12

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -211,3 +211,97 @@
211
211
  今回の数あてプログラムのようなものでも、考えるべきことは
212
212
 
213
213
  たくさんありますね。がんばってください!
214
+
215
+
216
+
217
+ ---
218
+
219
+ 再び追記します。
220
+
221
+
222
+
223
+
224
+
225
+ ランダム生成する数も、入力される数も4桁と決まっていて、
226
+
227
+ それら2つの4桁の数について、同じ位に同じ数字がいくつ
228
+
229
+ あるかを数えることが目的で、それを果たせればそれぞれの
230
+
231
+ 位の数字を配列にする必要が特にないのであれば、
232
+
233
+ 以下のメソッド
234
+
235
+
236
+
237
+ int countMatchedDigits(int a, int b)
238
+
239
+
240
+
241
+ のようにシンプルに書けます。
242
+
243
+
244
+
245
+ ```lang-java
246
+
247
+ public class Hitblow2 {
248
+
249
+
250
+
251
+ // 2つの4桁の整数、a と bについて、同じ桁に同じ数が
252
+
253
+ // いくつあるかを返す。
254
+
255
+ private static int countMatchedDigits(int a, int b)
256
+
257
+ {
258
+
259
+ int count = 0;
260
+
261
+
262
+
263
+ for ( int divisor = 1000; divisor >= 1; divisor /= 10 ) {
264
+
265
+ if ( a / divisor == b / divisor)
266
+
267
+ count ++;
268
+
269
+ a %= divisor;
270
+
271
+ b %= divisor;
272
+
273
+ }
274
+
275
+
276
+
277
+ return count;
278
+
279
+ }
280
+
281
+
282
+
283
+ // 上記のメソッドのテスト
284
+
285
+ public static void main(String[] args)
286
+
287
+ {
288
+
289
+ System.out.println(countMatchedDigits(1234, 1234)); // 4と表示される。
290
+
291
+ System.out.println(countMatchedDigits(1234, 2345)); // 0と表示される。
292
+
293
+ System.out.println(countMatchedDigits(1234, 9234)); // 3と表示される。
294
+
295
+ }
296
+
297
+
298
+
299
+ }
300
+
301
+ ```
302
+
303
+
304
+
305
+ 以上、参考になれば幸いです。
306
+
307
+

6

テキスト追加

2015/06/07 03:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -184,7 +184,7 @@
184
184
 
185
185
    =>この例では、"1"だけが一致しているので、一致しているものの数は1
186
186
 
187
- �=jj
187
+
188
188
 
189
189
  なのか
190
190
 

5

テキスト修正

2015/06/07 02:09

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
File without changes

4

テキスト追加

2015/06/07 02:08

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -169,3 +169,45 @@
169
169
  どのように対応するのかも、要検討かもしれませんね。
170
170
 
171
171
 
172
+
173
+ たとえば、ランダム生成したans が 1234 のときに、ユーザーからの入力が
174
+
175
+ 134 だったとすると、
176
+
177
+
178
+
179
+ ・両者をいわば"1234"と"134"という文字列と考えて、
180
+
181
+  先頭からの同じ位置の数字が一致するものを数えたい。
182
+
183
+
184
+
185
+   =>この例では、"1"だけが一致しているので、一致しているものの数は1
186
+
187
+ �=jj
188
+
189
+ なのか
190
+
191
+
192
+
193
+ ・ユーザーから入力された134は、整数の値の百三十四であるとして
194
+
195
+  1234と134の各位の数字が一致しているものの数を数えたい。
196
+
197
+
198
+
199
+   => この例では、十の位の3と、一の位の4が一致するので、
200
+
201
+    一致しているものの数は2
202
+
203
+
204
+
205
+ なのかで、書くべきプログラムも変わってきます。
206
+
207
+
208
+
209
+
210
+
211
+ 今回の数あてプログラムのようなものでも、考えるべきことは
212
+
213
+ たくさんありますね。がんばってください!

3

テキスト追加

2015/06/07 02:07

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -151,3 +151,21 @@
151
151
 
152
152
 
153
153
  以上ご参考になれば幸いです。
154
+
155
+ ---
156
+
157
+ 追記します。
158
+
159
+
160
+
161
+ (以下の懸案事項ですが、もし、すでに認識されている問題なら、すみません。)
162
+
163
+ 現状のコードだと、ユーザーからの入力も4桁であることを前提にして
164
+
165
+ しまっているように思えますが、4桁よりも少ない桁の数(たとえば、
166
+
167
+ 100とか)または大きい桁の数字(たとえば、9999999)を入力された場合に、
168
+
169
+ どのように対応するのかも、要検討かもしれませんね。
170
+
171
+

2

テキスト修正

2015/06/07 01:54

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -74,11 +74,7 @@
74
74
 
75
75
  > 答えではなくヒント
76
76
 
77
- とのことなので書きませんが、配列b の中に重複る数字が
77
+ とのことなので書かないでおきます
78
-
79
- あったときに、countMatchesメソッドはどのような値を
80
-
81
- 返すべきなのか?など、考えることがありそうです。
82
78
 
83
79
 
84
80
 

1

テキスト修正

2015/06/07 01:16

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -16,9 +16,9 @@
16
16
 
17
17
  ```
18
18
 
19
- このメソッドは、整数の配列 a の中に、整数の配列 b の各要素の数字が何個
19
+ このメソッドは、整数の配列 a 配列 b を比較して、同じ位置に同じ
20
20
 
21
- 含まれていかを合計して、そ合計数を返します。たとえば
21
+ 数があ要素の数を返します。たとえば
22
22
 
23
23
  a が、{ 1, 2, 3, 4 } で、b が { 1, 5, 2, 4 } のときに
24
24