teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

10

テキスト修正

2015/06/07 13:19

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -157,7 +157,7 @@
157
157
 
158
158
 
159
159
  もう1つ、
160
- 「4桁の数字が2つあったときに、同じの数字が同じどうかを判定する方法」
160
+ 「4桁の数字が2つあったときに、同じの数字が一致しているかを判定する方法」
161
161
  を思いついたので、挙げておきますね。
162
162
 
163
163
  まず前提として、今回の場合、ランダム生成する4桁の数字は、各桁が

9

テキスト修正

2015/06/07 13:19

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -183,20 +183,21 @@
183
183
  この正規表現は、
184
184
  「1以上9以下の数字だけで構成された、長さ8の文字列で、
185
185
   かつ、一番左の数字と左から5番目の数字が同じもの」
186
- というものになっています。
186
+ を表しています。
187
187
 
188
188
  たとえば、
189
189
  - a=1234, b=1784 のときの s="12341784" はこの正規表現にマッチしますが、
190
190
  - a=5678, b=9876 のときの s="56789876" はこの正規表現にマッチしません。
191
191
 
192
192
  (4) 同様に、aとbの百の位、十の位、一の位の数字が一致するかどうかを
193
- 判定するための、sに対する正規表現を作ることができるので、これら4つの
193
+ 判定するための、sに対する正規表現を、各々作ることができ、これら4つの
194
- 正規表現のうち、s にマッチするものの個数が、aとbとで数字が同じ桁の
194
+ 正規表現のうち、s にマッチするものの個数が、aとbとで数字が同じ桁の個数
195
- 個数になります。
195
+ になります。
196
196
 
197
+
197
- 以上、正規表現を使えばこんな感じにも書けますということで、
198
+ 正規表現の学習はれからかもしれませが、こんな感じにも
198
- 参考に留めて頂ければ幸いです。
199
+ 書けますということで、参考に留めて頂ければ幸いです。
199
-
200
+
200
201
   
201
202
   
202
203
 

8

テキスト追加

2015/06/07 13:17

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
  以上ご参考になれば幸いです。
78
78
  ---
79
- 追記します。
79
+ 追記(1)
80
80
 
81
81
  (以下の懸案事項ですが、もし、すでに認識されている問題なら、すみません。)
82
82
  現状のコードだと、ユーザーからの入力も4桁であることを前提にして
@@ -107,7 +107,7 @@
107
107
  たくさんありますね。がんばってください!
108
108
 
109
109
  ---
110
- 再び追記します。
110
+ 追記(2)
111
111
 
112
112
 
113
113
  ランダム生成する数も、入力される数も4桁と決まっていて、
@@ -151,3 +151,55 @@
151
151
  ```
152
152
 
153
153
  以上、参考になれば幸いです。
154
+
155
+ ---
156
+ 追記(3)
157
+
158
+
159
+ もう1つ、
160
+ 「4桁の数字が2つあったときに、同じ桁の数字が同じかどうかを判定する方法」
161
+ を思いついたので、挙げておきますね。
162
+
163
+ まず前提として、今回の場合、ランダム生成する4桁の数字は、各桁が
164
+ ans[i] = (int)(Math.random() * 9) + 1;
165
+ という作成のされ方をするので、どの桁も1以上9以下ですので、
166
+ 数字0を含まない4桁の整数として、aとbを検証の対象とします。
167
+
168
+ このとき、
169
+
170
+ (1) aとbを文字列として連結した文字列s を作成します。
171
+   たとえば、
172
+   a=1234, b=1784 なら、s="12341784" です。
173
+
174
+ (2)このように s を作ると、 a と b の千の位の数字が一致するか
175
+   どうかを判定するには、文字列 s の一番左の数字と、左から
176
+   5番目の数字が一致するかどうかを調べればよいことになります。
177
+
178
+ (3) 上記(2)を調べるには、文字列s が正規表現
179
+
180
+ **^([1-9])[1-9]{3}\1[1-9]{3}$**
181
+
182
+ にマッチするかどうかを調べればよいです。
183
+ この正規表現は、
184
+ 「1以上9以下の数字だけで構成された、長さ8の文字列で、
185
+  かつ、一番左の数字と左から5番目の数字が同じもの」
186
+ というものになっています。
187
+
188
+ たとえば、
189
+ - a=1234, b=1784 のときの s="12341784" はこの正規表現にマッチしますが、
190
+ - a=5678, b=9876 のときの s="56789876" はこの正規表現にマッチしません。
191
+
192
+ (4) 同様に、aとbの百の位、十の位、一の位の数字が一致するかどうかを
193
+ 判定するための、sに対する正規表現を作ることができるので、これら4つの
194
+ 正規表現のうち、s にマッチするものの個数が、aとbとで数字が同じ桁の
195
+ 個数になります。
196
+
197
+ 以上、正規表現を使えばこんな感じにも書けますということで、
198
+ 参考に留めて頂ければ幸いです。
199
+
200
+  
201
+  
202
+
203
+
204
+
205
+

7

テキスト追加

2015/06/07 13:12

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -104,4 +104,50 @@
104
104
 
105
105
 
106
106
  今回の数あてプログラムのようなものでも、考えるべきことは
107
- たくさんありますね。がんばってください!
107
+ たくさんありますね。がんばってください!
108
+
109
+ ---
110
+ 再び追記します。
111
+
112
+
113
+ ランダム生成する数も、入力される数も4桁と決まっていて、
114
+ それら2つの4桁の数について、同じ位に同じ数字がいくつ
115
+ あるかを数えることが目的で、それを果たせればそれぞれの
116
+ 位の数字を配列にする必要が特にないのであれば、
117
+ 以下のメソッド
118
+
119
+ int countMatchedDigits(int a, int b)
120
+
121
+ のようにシンプルに書けます。
122
+
123
+ ```lang-java
124
+ public class Hitblow2 {
125
+
126
+ // 2つの4桁の整数、a と bについて、同じ桁に同じ数が
127
+ // いくつあるかを返す。
128
+ private static int countMatchedDigits(int a, int b)
129
+ {
130
+ int count = 0;
131
+
132
+ for ( int divisor = 1000; divisor >= 1; divisor /= 10 ) {
133
+ if ( a / divisor == b / divisor)
134
+ count ++;
135
+ a %= divisor;
136
+ b %= divisor;
137
+ }
138
+
139
+ return count;
140
+ }
141
+
142
+ // 上記のメソッドのテスト
143
+ public static void main(String[] args)
144
+ {
145
+ System.out.println(countMatchedDigits(1234, 1234)); // 4と表示される。
146
+ System.out.println(countMatchedDigits(1234, 2345)); // 0と表示される。
147
+ System.out.println(countMatchedDigits(1234, 9234)); // 3と表示される。
148
+ }
149
+
150
+ }
151
+ ```
152
+
153
+ 以上、参考になれば幸いです。

6

テキスト追加

2015/06/07 03:48

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -91,7 +91,7 @@
91
91
   先頭からの同じ位置の数字が一致するものを数えたい。
92
92
 
93
93
    =>この例では、"1"だけが一致しているので、一致しているものの数は1
94
- �=jj
94
+
95
95
  なのか
96
96
 
97
97
  ・ユーザーから入力された134は、整数の値の百三十四であるとして

5

テキスト修正

2015/06/07 02:09

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
File without changes

4

テキスト追加

2015/06/07 02:08

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -83,3 +83,25 @@
83
83
  しまっているように思えますが、4桁よりも少ない桁の数(たとえば、
84
84
  100とか)または大きい桁の数字(たとえば、9999999)を入力された場合に、
85
85
  どのように対応するのかも、要検討かもしれませんね。
86
+
87
+ たとえば、ランダム生成したans が 1234 のときに、ユーザーからの入力が
88
+ 134 だったとすると、
89
+
90
+ ・両者をいわば"1234"と"134"という文字列と考えて、
91
+  先頭からの同じ位置の数字が一致するものを数えたい。
92
+
93
+   =>この例では、"1"だけが一致しているので、一致しているものの数は1
94
+ �=jj
95
+ なのか
96
+
97
+ ・ユーザーから入力された134は、整数の値の百三十四であるとして
98
+  1234と134の各位の数字が一致しているものの数を数えたい。
99
+
100
+   => この例では、十の位の3と、一の位の4が一致するので、
101
+    一致しているものの数は2
102
+
103
+ なのかで、書くべきプログラムも変わってきます。
104
+
105
+
106
+ 今回の数あてプログラムのようなものでも、考えるべきことは
107
+ たくさんありますね。がんばってください!

3

テキスト追加

2015/06/07 02:07

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -74,4 +74,12 @@
74
74
  matchCount
75
75
  にするのかで、少し悩みました。
76
76
 
77
- 以上ご参考になれば幸いです。
77
+ 以上ご参考になれば幸いです。
78
+ ---
79
+ 追記します。
80
+
81
+ (以下の懸案事項ですが、もし、すでに認識されている問題なら、すみません。)
82
+ 現状のコードだと、ユーザーからの入力も4桁であることを前提にして
83
+ しまっているように思えますが、4桁よりも少ない桁の数(たとえば、
84
+ 100とか)または大きい桁の数字(たとえば、9999999)を入力された場合に、
85
+ どのように対応するのかも、要検討かもしれませんね。

2

テキスト修正

2015/06/07 01:54

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -36,9 +36,7 @@
36
36
 
37
37
  countMatchesメソッドの詳細は、
38
38
  > 答えではなくヒント
39
- とのことなので書きませんが、配列b の中に重複る数字が
39
+ とのことなので書かないでおきます
40
- あったときに、countMatchesメソッドはどのような値を
41
- 返すべきなのか?など、考えることがありそうです。
42
40
 
43
41
  以上が「こうしてみては?」というひとつの考え方です。
44
42
 

1

テキスト修正

2015/06/07 01:16

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -7,8 +7,8 @@
7
7
  ```lang-java
8
8
  private static int countMatches(int[] a, int b[])
9
9
  ```
10
- このメソッドは、整数の配列 a の中に、整数の配列 b の各要素の数字が何個
10
+ このメソッドは、整数の配列 a 配列 b を比較して、同じ位置に同じ
11
- 含まれていかを合計して、そ合計数を返します。たとえば
11
+ 数があ要素の数を返します。たとえば
12
12
  a が、{ 1, 2, 3, 4 } で、b が { 1, 5, 2, 4 } のときに
13
13
 
14
14
  countMatches(a, b)