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

回答編集履歴

5

Update expression

2020/07/02 09:29

投稿

y_shinoda
y_shinoda

スコア3272

answer CHANGED
@@ -347,7 +347,8 @@
347
347
  > count_i = 1,1,2,2,1
348
348
  > count_j = 1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2
349
349
 
350
+ この、**別々の統計**を取るような認識が正しくありません、
350
- この認識は正しくありません、次のようにとらえる必要があります:
351
+ 次のように**組み合わせ**でとらえる必要があります:
351
352
 
352
353
  -(10,8,11,11,4)の場合-
353
354
 

4

Add fourth expression

2020/07/02 09:29

投稿

y_shinoda
y_shinoda

スコア3272

answer CHANGED
@@ -322,4 +322,67 @@
322
322
  NO PAIR
323
323
  ---------------------------------
324
324
  TWO PAIR
325
+ ```
326
+
327
+ ### `count_i` と `count_j` による役の評価について
328
+
329
+ > なぜXの数字を除いた手札×4を作ることによって、
330
+ > カードXでペアになっていたもの(11,11)を除けるのでしょうか?
331
+ >
332
+ > -(10,8,11,11,4)の場合-
333
+ > count_i = 1,1,2,2,1
334
+ > count_j = 1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2
335
+ >
336
+ > if count_i ==2 and count_j < 2
337
+ > この役はワンペアですが、
338
+ > count_j == 2となるのでツーペアになると思ったのですが、
339
+ > なぜcount_j < 2となるのでしょうか?
340
+
341
+ 上記 [残りの手札を作る理由] [検証] の実行結果で見たように、
342
+ 役の判定において `count_i` と `count_j` は
343
+ 「**別々の統計**が評価されている」のではなく、
344
+ 「**組み合わせ**ごとに評価されています」
345
+
346
+ > -(10,8,11,11,4)の場合-
347
+ > count_i = 1,1,2,2,1
348
+ > count_j = 1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2
349
+
350
+ この認識は正しくありません、次のようにとらえる必要があります:
351
+
352
+ -(10,8,11,11,4)の場合-
353
+
354
+ `count_i`|`count_j`|役
355
+ ---|---
356
+ 1|1|NO PAIR
357
+ 1|1|NO PAIR
358
+ 1|2|NO PAIR
359
+ 1|2|NO PAIR
360
+ 1|1|NO PAIR
361
+ 1|1|NO PAIR
362
+ 1|1|NO PAIR
363
+ 1|2|NO PAIR
364
+ 1|2|NO PAIR
365
+ 1|1|NO PAIR
366
+ 2|1|ONE PAIR
367
+ 2|1|ONE PAIR
368
+ 2|2|TWO PAIR
369
+ 2|2|TWO PAIR
370
+ 2|1|ONE PAIR
371
+ 2|1|ONE PAIR
372
+ 2|1|ONE PAIR
373
+ 2|2|TWO PAIR
374
+ 2|2|TWO PAIR
375
+ 2|1|ONE PAIR
376
+ 1|1|NO PAIR
377
+ 1|1|NO PAIR
378
+ 1|2|NO PAIR
379
+ 1|2|NO PAIR
380
+ 1|1|NO PAIR
381
+
382
+ 最後に最大の役を調べると、`TWO PAIR` となります
383
+
384
+ 最大の役を調べているコードは次の箇所です:
385
+
386
+ ```python
387
+ result = max(results)
325
388
  ```

3

Add third investigation

2020/07/02 09:21

投稿

y_shinoda
y_shinoda

スコア3272

answer CHANGED
@@ -17,7 +17,7 @@
17
17
  left_hands.append(n)
18
18
  ```
19
19
 
20
- ## 実験
20
+ ### 実験
21
21
 
22
22
  変数の変化を確認するために、内包表記を `for` と `if` のブロックに書き換えて
23
23
  `print()` を追加してみましょう:
@@ -105,6 +105,8 @@
105
105
 
106
106
  ## 追記
107
107
 
108
+ ### `count_j` が必要な理由
109
+
108
110
  > その次にleft_handsの4個のリストをforで回してjにいれて、
109
111
  > list_handsの値(10,8,11,11,4)にjがいくつ含まれているのかカウントしていますが、
110
112
  > なぜcount_jが必要なのでしょうか??
@@ -146,4 +148,178 @@
146
148
  results.append(5) # FULL HOUSE
147
149
  else:
148
150
  results.append(0) # NO PAIR
151
+ ```
152
+
153
+ ### 残りの手札を作る理由
154
+
155
+ > なぜ カード X の数字を除いた残りの手札、を作る必要があるのでしょうか?
156
+
157
+ もし、`別の数`をいくつ含む処理の前に
158
+ `カード X` の数字を除いた残りの手札を作らなければ、
159
+ `カード Y` を選ぶときに
160
+ `カード X` と同じ数字を選んでしまう可能性があります
161
+ すると、たとえば `ONE PAIR` でも `TWO PAIR` と判定されてしまいます
162
+
163
+ 例では 5 枚のカードとして `10` `8` `11` `11` `4` が与えられています
164
+ ここで、`カード X` も`カード Y` も `11` を選んでしまうと
165
+ `11` の枚数は 2 枚なので判定が `TWO PAIR` になってしまいます
166
+
167
+ #### 実験
168
+
169
+ `list_hands` ではなく `left_hands` から`カード Y` を選ぶとどうなるか見てみましょう:
170
+
171
+ ```python
172
+ def check_hand(a,b,c,d,e):
173
+ list_hands = [a,b,c,d,e]
174
+ dict_hands = {0 : "NO PAIR", 1 : "ONE PAIR", 2 : "TWO PAIR", 3 : "THREE CARD", 4 : "FOUR CARD", 5 : "FULL HOUSE"}
175
+ results = []
176
+
177
+ for i in list_hands:#カードXを選ぶ
178
+ count_i = list_hands.count(i)#手札の中にあるカードXの個数をカウント
179
+
180
+ # left_hands = [n for n in list_hands if n != i] #Xの数字を除いた残りの手札
181
+ # left_hands = []
182
+ # for n in list_hands:
183
+ # # ↓ この時点での n, i の値を確認します
184
+ # print('n, i = ' + str(n) + ', ' + str(i))
185
+ # if n != i:
186
+ # left_hands.append(n)
187
+ # # ↓ left_hands の値を確認します
188
+ # print('left_hands = ' + str(left_hands))
189
+ # print('---------------------------------')
190
+ # for j in left_hands:#X以外の数字のカードからカードYを選ぶ
191
+ for j in list_hands:#X以外の数字のカードからカードYを選ぶ
192
+ count_j = list_hands.count(j)#手札の中にあるカードYの個数をカウント
193
+ print("カードX, Y = " + str(i) + ", " + str(j))
194
+ print("個数 X, Y = " + str(count_i) + ", " + str(count_j))
195
+ if count_i == 2 and count_j < 2:
196
+ print("ONE PAIR")
197
+ results.append(1)
198
+ elif count_i == 2 and count_j == 2:
199
+ print("TWO PAIR")
200
+ results.append(2)
201
+ elif count_i == 3 and count_j == 1:
202
+ print("THREE CARD")
203
+ results.append(3)
204
+ elif count_i == 4 and count_j == 1 :
205
+ print("FOUR CARD")
206
+ results.append(4)
207
+ elif count_i == 3 and count_j == 2 :
208
+ print("FULL HOUSE")
209
+ results.append(5)
210
+ else:
211
+ print("NO PAIR")
212
+ results.append(0)
213
+ print('---------------------------------')
214
+ result = max(results)
215
+ return dict_hands[result]
216
+
217
+ print(check_hand(10,8,11,11,4))
218
+ ```
219
+
220
+ 実行結果:
221
+
222
+ ```console
223
+ $ python test.py
224
+ カードX, Y = 10, 10
225
+ 個数 X, Y = 1, 1
226
+ NO PAIR
227
+ ---------------------------------
228
+ カードX, Y = 10, 8
229
+ 個数 X, Y = 1, 1
230
+ NO PAIR
231
+ ---------------------------------
232
+ カードX, Y = 10, 11
233
+ 個数 X, Y = 1, 2
234
+ NO PAIR
235
+ ---------------------------------
236
+ カードX, Y = 10, 11
237
+ 個数 X, Y = 1, 2
238
+ NO PAIR
239
+ ---------------------------------
240
+ カードX, Y = 10, 4
241
+ 個数 X, Y = 1, 1
242
+ NO PAIR
243
+ ---------------------------------
244
+ カードX, Y = 8, 10
245
+ 個数 X, Y = 1, 1
246
+ NO PAIR
247
+ ---------------------------------
248
+ カードX, Y = 8, 8
249
+ 個数 X, Y = 1, 1
250
+ NO PAIR
251
+ ---------------------------------
252
+ カードX, Y = 8, 11
253
+ 個数 X, Y = 1, 2
254
+ NO PAIR
255
+ ---------------------------------
256
+ カードX, Y = 8, 11
257
+ 個数 X, Y = 1, 2
258
+ NO PAIR
259
+ ---------------------------------
260
+ カードX, Y = 8, 4
261
+ 個数 X, Y = 1, 1
262
+ NO PAIR
263
+ ---------------------------------
264
+ カードX, Y = 11, 10
265
+ 個数 X, Y = 2, 1
266
+ ONE PAIR
267
+ ---------------------------------
268
+ カードX, Y = 11, 8
269
+ 個数 X, Y = 2, 1
270
+ ONE PAIR
271
+ ---------------------------------
272
+ カードX, Y = 11, 11
273
+ 個数 X, Y = 2, 2
274
+ TWO PAIR
275
+ ---------------------------------
276
+ カードX, Y = 11, 11
277
+ 個数 X, Y = 2, 2
278
+ TWO PAIR
279
+ ---------------------------------
280
+ カードX, Y = 11, 4
281
+ 個数 X, Y = 2, 1
282
+ ONE PAIR
283
+ ---------------------------------
284
+ カードX, Y = 11, 10
285
+ 個数 X, Y = 2, 1
286
+ ONE PAIR
287
+ ---------------------------------
288
+ カードX, Y = 11, 8
289
+ 個数 X, Y = 2, 1
290
+ ONE PAIR
291
+ ---------------------------------
292
+ カードX, Y = 11, 11
293
+ 個数 X, Y = 2, 2
294
+ TWO PAIR
295
+ ---------------------------------
296
+ カードX, Y = 11, 11
297
+ 個数 X, Y = 2, 2
298
+ TWO PAIR
299
+ ---------------------------------
300
+ カードX, Y = 11, 4
301
+ 個数 X, Y = 2, 1
302
+ ONE PAIR
303
+ ---------------------------------
304
+ カードX, Y = 4, 10
305
+ 個数 X, Y = 1, 1
306
+ NO PAIR
307
+ ---------------------------------
308
+ カードX, Y = 4, 8
309
+ 個数 X, Y = 1, 1
310
+ NO PAIR
311
+ ---------------------------------
312
+ カードX, Y = 4, 11
313
+ 個数 X, Y = 1, 2
314
+ NO PAIR
315
+ ---------------------------------
316
+ カードX, Y = 4, 11
317
+ 個数 X, Y = 1, 2
318
+ NO PAIR
319
+ ---------------------------------
320
+ カードX, Y = 4, 4
321
+ 個数 X, Y = 1, 1
322
+ NO PAIR
323
+ ---------------------------------
324
+ TWO PAIR
149
325
  ```

2

Add comment

2020/07/02 06:09

投稿

y_shinoda
y_shinoda

スコア3272

answer CHANGED
@@ -135,15 +135,15 @@
135
135
 
136
136
  ```python
137
137
  if count_i == 2 and count_j < 2:
138
- results.append(1)
138
+ results.append(1) # ONE PAIR
139
139
  elif count_i == 2 and count_j == 2:
140
- results.append(2)
140
+ results.append(2) # TWO PAIR
141
141
  elif count_i == 3 and count_j == 1:
142
- results.append(3)
142
+ results.append(3) # THREE CARD
143
143
  elif count_i == 4 and count_j == 1:
144
- results.append(4)
144
+ results.append(4) # FOUR CARD
145
145
  elif count_i == 3 and count_j == 2:
146
- results.append(5)
146
+ results.append(5) # FULL HOUSE
147
147
  else:
148
- results.append(0)
148
+ results.append(0) # NO PAIR
149
149
  ```

1

Add second expression

2020/07/01 09:01

投稿

y_shinoda
y_shinoda

スコア3272

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ## 元の回答
2
+
1
3
  ```python
2
4
  left_hands = [n for n in list_hands if n != i] #Xの数字を除いた残りの手札
3
5
  ```
@@ -99,4 +101,49 @@
99
101
  left_hands = [10, 8, 11, 11]
100
102
  ---------------------------------
101
103
  ONE PAIR
104
+ ```
105
+
106
+ ## 追記
107
+
108
+ > その次にleft_handsの4個のリストをforで回してjにいれて、
109
+ > list_handsの値(10,8,11,11,4)にjがいくつ含まれているのかカウントしていますが、
110
+ > なぜcount_jが必要なのでしょうか??
111
+ > 3週目の11の場合、
112
+ > list_handsにjの値がいくつあるかカウントして、
113
+ > 1,2,2,1,1,2,2~がcount_jに代入される→
114
+
115
+ 「`別の数`をちょうど 2 つ含」んでいないかを調べるためです
116
+
117
+ この問題は次のことを求めています:
118
+
119
+ > 配られた5枚のカードが、以下のいずれの役に該当するかを調べてください。
120
+
121
+ 役名|条件
122
+ ---|---
123
+ FULL HOUSE|`ある数`をちょうど 3 つと、`別の数`をちょうど 2 つ含む
124
+ FOUR CARD|`ある数`をちょうど 4 つ含む
125
+ THREE CARD|`ある数`をちょうど 3 つ含む
126
+ TWO PAIR|`ある数`をちょうど 2 つと、`別の数`をちょうど 2 つ含む
127
+ ONE PAIR|`ある数`をちょうど 2 つ含む
128
+
129
+ この Python コードでは、
130
+ `ある数`をいくつ含むかを調べて `count_i` に代入したあと、
131
+ `別の数`をいくつ含むかを調べて `count_j` に代入しています
132
+
133
+ そして、その `count_i`, `count_j` を使って、
134
+ 次の `if`, `elif`, `else` ブロックで役の判定を行っています:
135
+
136
+ ```python
137
+ if count_i == 2 and count_j < 2:
138
+ results.append(1)
139
+ elif count_i == 2 and count_j == 2:
140
+ results.append(2)
141
+ elif count_i == 3 and count_j == 1:
142
+ results.append(3)
143
+ elif count_i == 4 and count_j == 1:
144
+ results.append(4)
145
+ elif count_i == 3 and count_j == 2:
146
+ results.append(5)
147
+ else:
148
+ results.append(0)
102
149
  ```