回答編集履歴

5

Update expression

2020/07/02 09:29

投稿

y_shinoda
y_shinoda

スコア3272

test CHANGED
@@ -696,7 +696,9 @@
696
696
 
697
697
 
698
698
 
699
+ この、**別々の統計**を取るような認識が正しくありません、
700
+
699
- この認識は正しくありません、次のようにとらえる必要があります:
701
+ 次のように**組み合わせ**でとらえる必要があります:
700
702
 
701
703
 
702
704
 

4

Add fourth expression

2020/07/02 09:29

投稿

y_shinoda
y_shinoda

スコア3272

test CHANGED
@@ -647,3 +647,129 @@
647
647
  TWO PAIR
648
648
 
649
649
  ```
650
+
651
+
652
+
653
+ ### `count_i` と `count_j` による役の評価について
654
+
655
+
656
+
657
+ > なぜXの数字を除いた手札×4を作ることによって、
658
+
659
+ > カードXでペアになっていたもの(11,11)を除けるのでしょうか?
660
+
661
+ >
662
+
663
+ > -(10,8,11,11,4)の場合-
664
+
665
+ > count_i = 1,1,2,2,1
666
+
667
+ > count_j = 1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2
668
+
669
+ >
670
+
671
+ > if count_i ==2 and count_j < 2
672
+
673
+ > この役はワンペアですが、
674
+
675
+ > count_j == 2となるのでツーペアになると思ったのですが、
676
+
677
+ > なぜcount_j < 2となるのでしょうか?
678
+
679
+
680
+
681
+ 上記 [残りの手札を作る理由] [検証] の実行結果で見たように、
682
+
683
+ 役の判定において `count_i` と `count_j` は
684
+
685
+ 「**別々の統計**が評価されている」のではなく、
686
+
687
+ 「**組み合わせ**ごとに評価されています」
688
+
689
+
690
+
691
+ > -(10,8,11,11,4)の場合-
692
+
693
+ > count_i = 1,1,2,2,1
694
+
695
+ > count_j = 1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2
696
+
697
+
698
+
699
+ この認識は正しくありません、次のようにとらえる必要があります:
700
+
701
+
702
+
703
+ -(10,8,11,11,4)の場合-
704
+
705
+
706
+
707
+ `count_i`|`count_j`|役
708
+
709
+ ---|---
710
+
711
+ 1|1|NO PAIR
712
+
713
+ 1|1|NO PAIR
714
+
715
+ 1|2|NO PAIR
716
+
717
+ 1|2|NO PAIR
718
+
719
+ 1|1|NO PAIR
720
+
721
+ 1|1|NO PAIR
722
+
723
+ 1|1|NO PAIR
724
+
725
+ 1|2|NO PAIR
726
+
727
+ 1|2|NO PAIR
728
+
729
+ 1|1|NO PAIR
730
+
731
+ 2|1|ONE PAIR
732
+
733
+ 2|1|ONE PAIR
734
+
735
+ 2|2|TWO PAIR
736
+
737
+ 2|2|TWO PAIR
738
+
739
+ 2|1|ONE PAIR
740
+
741
+ 2|1|ONE PAIR
742
+
743
+ 2|1|ONE PAIR
744
+
745
+ 2|2|TWO PAIR
746
+
747
+ 2|2|TWO PAIR
748
+
749
+ 2|1|ONE PAIR
750
+
751
+ 1|1|NO PAIR
752
+
753
+ 1|1|NO PAIR
754
+
755
+ 1|2|NO PAIR
756
+
757
+ 1|2|NO PAIR
758
+
759
+ 1|1|NO PAIR
760
+
761
+
762
+
763
+ 最後に最大の役を調べると、`TWO PAIR` となります
764
+
765
+
766
+
767
+ 最大の役を調べているコードは次の箇所です:
768
+
769
+
770
+
771
+ ```python
772
+
773
+ result = max(results)
774
+
775
+ ```

3

Add third investigation

2020/07/02 09:21

投稿

y_shinoda
y_shinoda

スコア3272

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- ## 実験
39
+ ### 実験
40
40
 
41
41
 
42
42
 
@@ -212,6 +212,10 @@
212
212
 
213
213
 
214
214
 
215
+ ### `count_j` が必要な理由
216
+
217
+
218
+
215
219
  > その次にleft_handsの4個のリストをforで回してjにいれて、
216
220
 
217
221
  > list_handsの値(10,8,11,11,4)にjがいくつ含まれているのかカウントしていますが、
@@ -295,3 +299,351 @@
295
299
  results.append(0) # NO PAIR
296
300
 
297
301
  ```
302
+
303
+
304
+
305
+ ### 残りの手札を作る理由
306
+
307
+
308
+
309
+ > なぜ カード X の数字を除いた残りの手札、を作る必要があるのでしょうか?
310
+
311
+
312
+
313
+ もし、`別の数`をいくつ含む処理の前に
314
+
315
+ `カード X` の数字を除いた残りの手札を作らなければ、
316
+
317
+ `カード Y` を選ぶときに
318
+
319
+ `カード X` と同じ数字を選んでしまう可能性があります
320
+
321
+ すると、たとえば `ONE PAIR` でも `TWO PAIR` と判定されてしまいます
322
+
323
+
324
+
325
+ 例では 5 枚のカードとして `10` `8` `11` `11` `4` が与えられています
326
+
327
+ ここで、`カード X` も`カード Y` も `11` を選んでしまうと
328
+
329
+ `11` の枚数は 2 枚なので判定が `TWO PAIR` になってしまいます
330
+
331
+
332
+
333
+ #### 実験
334
+
335
+
336
+
337
+ `list_hands` ではなく `left_hands` から`カード Y` を選ぶとどうなるか見てみましょう:
338
+
339
+
340
+
341
+ ```python
342
+
343
+ def check_hand(a,b,c,d,e):
344
+
345
+ list_hands = [a,b,c,d,e]
346
+
347
+ dict_hands = {0 : "NO PAIR", 1 : "ONE PAIR", 2 : "TWO PAIR", 3 : "THREE CARD", 4 : "FOUR CARD", 5 : "FULL HOUSE"}
348
+
349
+ results = []
350
+
351
+
352
+
353
+ for i in list_hands:#カードXを選ぶ
354
+
355
+ count_i = list_hands.count(i)#手札の中にあるカードXの個数をカウント
356
+
357
+
358
+
359
+ # left_hands = [n for n in list_hands if n != i] #Xの数字を除いた残りの手札
360
+
361
+ # left_hands = []
362
+
363
+ # for n in list_hands:
364
+
365
+ # # ↓ この時点での n, i の値を確認します
366
+
367
+ # print('n, i = ' + str(n) + ', ' + str(i))
368
+
369
+ # if n != i:
370
+
371
+ # left_hands.append(n)
372
+
373
+ # # ↓ left_hands の値を確認します
374
+
375
+ # print('left_hands = ' + str(left_hands))
376
+
377
+ # print('---------------------------------')
378
+
379
+ # for j in left_hands:#X以外の数字のカードからカードYを選ぶ
380
+
381
+ for j in list_hands:#X以外の数字のカードからカードYを選ぶ
382
+
383
+ count_j = list_hands.count(j)#手札の中にあるカードYの個数をカウント
384
+
385
+ print("カードX, Y = " + str(i) + ", " + str(j))
386
+
387
+ print("個数 X, Y = " + str(count_i) + ", " + str(count_j))
388
+
389
+ if count_i == 2 and count_j < 2:
390
+
391
+ print("ONE PAIR")
392
+
393
+ results.append(1)
394
+
395
+ elif count_i == 2 and count_j == 2:
396
+
397
+ print("TWO PAIR")
398
+
399
+ results.append(2)
400
+
401
+ elif count_i == 3 and count_j == 1:
402
+
403
+ print("THREE CARD")
404
+
405
+ results.append(3)
406
+
407
+ elif count_i == 4 and count_j == 1 :
408
+
409
+ print("FOUR CARD")
410
+
411
+ results.append(4)
412
+
413
+ elif count_i == 3 and count_j == 2 :
414
+
415
+ print("FULL HOUSE")
416
+
417
+ results.append(5)
418
+
419
+ else:
420
+
421
+ print("NO PAIR")
422
+
423
+ results.append(0)
424
+
425
+ print('---------------------------------')
426
+
427
+ result = max(results)
428
+
429
+ return dict_hands[result]
430
+
431
+
432
+
433
+ print(check_hand(10,8,11,11,4))
434
+
435
+ ```
436
+
437
+
438
+
439
+ 実行結果:
440
+
441
+
442
+
443
+ ```console
444
+
445
+ $ python test.py
446
+
447
+ カードX, Y = 10, 10
448
+
449
+ 個数 X, Y = 1, 1
450
+
451
+ NO PAIR
452
+
453
+ ---------------------------------
454
+
455
+ カードX, Y = 10, 8
456
+
457
+ 個数 X, Y = 1, 1
458
+
459
+ NO PAIR
460
+
461
+ ---------------------------------
462
+
463
+ カードX, Y = 10, 11
464
+
465
+ 個数 X, Y = 1, 2
466
+
467
+ NO PAIR
468
+
469
+ ---------------------------------
470
+
471
+ カードX, Y = 10, 11
472
+
473
+ 個数 X, Y = 1, 2
474
+
475
+ NO PAIR
476
+
477
+ ---------------------------------
478
+
479
+ カードX, Y = 10, 4
480
+
481
+ 個数 X, Y = 1, 1
482
+
483
+ NO PAIR
484
+
485
+ ---------------------------------
486
+
487
+ カードX, Y = 8, 10
488
+
489
+ 個数 X, Y = 1, 1
490
+
491
+ NO PAIR
492
+
493
+ ---------------------------------
494
+
495
+ カードX, Y = 8, 8
496
+
497
+ 個数 X, Y = 1, 1
498
+
499
+ NO PAIR
500
+
501
+ ---------------------------------
502
+
503
+ カードX, Y = 8, 11
504
+
505
+ 個数 X, Y = 1, 2
506
+
507
+ NO PAIR
508
+
509
+ ---------------------------------
510
+
511
+ カードX, Y = 8, 11
512
+
513
+ 個数 X, Y = 1, 2
514
+
515
+ NO PAIR
516
+
517
+ ---------------------------------
518
+
519
+ カードX, Y = 8, 4
520
+
521
+ 個数 X, Y = 1, 1
522
+
523
+ NO PAIR
524
+
525
+ ---------------------------------
526
+
527
+ カードX, Y = 11, 10
528
+
529
+ 個数 X, Y = 2, 1
530
+
531
+ ONE PAIR
532
+
533
+ ---------------------------------
534
+
535
+ カードX, Y = 11, 8
536
+
537
+ 個数 X, Y = 2, 1
538
+
539
+ ONE PAIR
540
+
541
+ ---------------------------------
542
+
543
+ カードX, Y = 11, 11
544
+
545
+ 個数 X, Y = 2, 2
546
+
547
+ TWO PAIR
548
+
549
+ ---------------------------------
550
+
551
+ カードX, Y = 11, 11
552
+
553
+ 個数 X, Y = 2, 2
554
+
555
+ TWO PAIR
556
+
557
+ ---------------------------------
558
+
559
+ カードX, Y = 11, 4
560
+
561
+ 個数 X, Y = 2, 1
562
+
563
+ ONE PAIR
564
+
565
+ ---------------------------------
566
+
567
+ カードX, Y = 11, 10
568
+
569
+ 個数 X, Y = 2, 1
570
+
571
+ ONE PAIR
572
+
573
+ ---------------------------------
574
+
575
+ カードX, Y = 11, 8
576
+
577
+ 個数 X, Y = 2, 1
578
+
579
+ ONE PAIR
580
+
581
+ ---------------------------------
582
+
583
+ カードX, Y = 11, 11
584
+
585
+ 個数 X, Y = 2, 2
586
+
587
+ TWO PAIR
588
+
589
+ ---------------------------------
590
+
591
+ カードX, Y = 11, 11
592
+
593
+ 個数 X, Y = 2, 2
594
+
595
+ TWO PAIR
596
+
597
+ ---------------------------------
598
+
599
+ カードX, Y = 11, 4
600
+
601
+ 個数 X, Y = 2, 1
602
+
603
+ ONE PAIR
604
+
605
+ ---------------------------------
606
+
607
+ カードX, Y = 4, 10
608
+
609
+ 個数 X, Y = 1, 1
610
+
611
+ NO PAIR
612
+
613
+ ---------------------------------
614
+
615
+ カードX, Y = 4, 8
616
+
617
+ 個数 X, Y = 1, 1
618
+
619
+ NO PAIR
620
+
621
+ ---------------------------------
622
+
623
+ カードX, Y = 4, 11
624
+
625
+ 個数 X, Y = 1, 2
626
+
627
+ NO PAIR
628
+
629
+ ---------------------------------
630
+
631
+ カードX, Y = 4, 11
632
+
633
+ 個数 X, Y = 1, 2
634
+
635
+ NO PAIR
636
+
637
+ ---------------------------------
638
+
639
+ カードX, Y = 4, 4
640
+
641
+ 個数 X, Y = 1, 1
642
+
643
+ NO PAIR
644
+
645
+ ---------------------------------
646
+
647
+ TWO PAIR
648
+
649
+ ```

2

Add comment

2020/07/02 06:09

投稿

y_shinoda
y_shinoda

スコア3272

test CHANGED
@@ -272,26 +272,26 @@
272
272
 
273
273
  if count_i == 2 and count_j < 2:
274
274
 
275
- results.append(1)
275
+ results.append(1) # ONE PAIR
276
276
 
277
277
  elif count_i == 2 and count_j == 2:
278
278
 
279
- results.append(2)
279
+ results.append(2) # TWO PAIR
280
280
 
281
281
  elif count_i == 3 and count_j == 1:
282
282
 
283
- results.append(3)
283
+ results.append(3) # THREE CARD
284
284
 
285
285
  elif count_i == 4 and count_j == 1:
286
286
 
287
- results.append(4)
287
+ results.append(4) # FOUR CARD
288
288
 
289
289
  elif count_i == 3 and count_j == 2:
290
290
 
291
- results.append(5)
291
+ results.append(5) # FULL HOUSE
292
292
 
293
293
  else:
294
294
 
295
- results.append(0)
295
+ results.append(0) # NO PAIR
296
-
296
+
297
- ```
297
+ ```

1

Add second expression

2020/07/01 09:01

投稿

y_shinoda
y_shinoda

スコア3272

test CHANGED
@@ -1,3 +1,7 @@
1
+ ## 元の回答
2
+
3
+
4
+
1
5
  ```python
2
6
 
3
7
  left_hands = [n for n in list_hands if n != i] #Xの数字を除いた残りの手札
@@ -201,3 +205,93 @@
201
205
  ONE PAIR
202
206
 
203
207
  ```
208
+
209
+
210
+
211
+ ## 追記
212
+
213
+
214
+
215
+ > その次にleft_handsの4個のリストをforで回してjにいれて、
216
+
217
+ > list_handsの値(10,8,11,11,4)にjがいくつ含まれているのかカウントしていますが、
218
+
219
+ > なぜcount_jが必要なのでしょうか??
220
+
221
+ > 3週目の11の場合、
222
+
223
+ > list_handsにjの値がいくつあるかカウントして、
224
+
225
+ > 1,2,2,1,1,2,2~がcount_jに代入される→
226
+
227
+
228
+
229
+ 「`別の数`をちょうど 2 つ含」んでいないかを調べるためです
230
+
231
+
232
+
233
+ この問題は次のことを求めています:
234
+
235
+
236
+
237
+ > 配られた5枚のカードが、以下のいずれの役に該当するかを調べてください。
238
+
239
+
240
+
241
+ 役名|条件
242
+
243
+ ---|---
244
+
245
+ FULL HOUSE|`ある数`をちょうど 3 つと、`別の数`をちょうど 2 つ含む
246
+
247
+ FOUR CARD|`ある数`をちょうど 4 つ含む
248
+
249
+ THREE CARD|`ある数`をちょうど 3 つ含む
250
+
251
+ TWO PAIR|`ある数`をちょうど 2 つと、`別の数`をちょうど 2 つ含む
252
+
253
+ ONE PAIR|`ある数`をちょうど 2 つ含む
254
+
255
+
256
+
257
+ この Python コードでは、
258
+
259
+ `ある数`をいくつ含むかを調べて `count_i` に代入したあと、
260
+
261
+ `別の数`をいくつ含むかを調べて `count_j` に代入しています
262
+
263
+
264
+
265
+ そして、その `count_i`, `count_j` を使って、
266
+
267
+ 次の `if`, `elif`, `else` ブロックで役の判定を行っています:
268
+
269
+
270
+
271
+ ```python
272
+
273
+ if count_i == 2 and count_j < 2:
274
+
275
+ results.append(1)
276
+
277
+ elif count_i == 2 and count_j == 2:
278
+
279
+ results.append(2)
280
+
281
+ elif count_i == 3 and count_j == 1:
282
+
283
+ results.append(3)
284
+
285
+ elif count_i == 4 and count_j == 1:
286
+
287
+ results.append(4)
288
+
289
+ elif count_i == 3 and count_j == 2:
290
+
291
+ results.append(5)
292
+
293
+ else:
294
+
295
+ results.append(0)
296
+
297
+ ```