元の回答
python
1 left_hands = [ n for n in list_hands if n != i ] #Xの数字を除いた残りの手札
この内包表記
内では n
には list_hands
の要素が順に割り当てられますが、
i
の値は変化しません
上記の内包表記
は、
次の for
と if
のブロックで構成されたコードと同様の処理を行います:
python
1 left_hands = [ ]
2 for n in list_hands :
3 if n != i :
4 left_hands . append ( n )
実験
変数の変化を確認するために、内包表記を for
と if
のブロックに書き換えて
print()
を追加してみましょう:
python
1 def check_hand ( a , b , c , d , e ) :
2 list_hands = [ a , b , c , d , e ]
3 dict_hands = { 0 : "NO PAIR" , 1 : "ONE PAIR" , 2 : "TWO PAIR" , 3 : "THREE CARD" , 4 : "FOUR CARD" , 5 : "FULL HOUSE" }
4 results = [ ]
5
6 for i in list_hands : #カードXを選ぶ
7 count_i = list_hands . count ( i ) #手札の中にあるカードXの個数をカウント
8
9 # left_hands = [n for n in list_hands if n != i] #Xの数字を除いた残りの手札
10 left_hands = [ ]
11 for n in list_hands :
12 # ↓ この時点での n, i の値を確認します
13 print ( 'n, i = ' + str ( n ) + ', ' + str ( i ) )
14 if n != i :
15 left_hands . append ( n )
16 # ↓ left_hands の値を確認します
17 print ( 'left_hands = ' + str ( left_hands ) )
18 print ( '---------------------------------' )
19 for j in left_hands : #X以外の数字のカードからカードYを選ぶ
20 count_j = list_hands . count ( j ) #手札の中にあるカードYの個数をカウント
21 if count_i == 2 and count_j < 2 :
22 results . append ( 1 )
23 elif count_i == 2 and count_j == 2 :
24 results . append ( 2 )
25 elif count_i == 3 and count_j == 1 :
26 results . append ( 3 )
27 elif count_i == 4 and count_j == 1 :
28 results . append ( 4 )
29 elif count_i == 3 and count_j == 2 :
30 results . append ( 5 )
31 else :
32 results . append ( 0 )
33 result = max ( results )
34 return dict_hands [ result ]
35
36 print ( check_hand ( 10 , 8 , 11 , 11 , 4 ) )
実行結果:
console
1 $ python test.py
2 n, i = 10, 10
3 n, i = 8, 10
4 n, i = 11, 10
5 n, i = 11, 10
6 n, i = 4, 10
7 left_hands = [8, 11, 11, 4]
8 ---------------------------------
9 n, i = 10, 8
10 n, i = 8, 8
11 n, i = 11, 8
12 n, i = 11, 8
13 n, i = 4, 8
14 left_hands = [10, 11, 11, 4]
15 ---------------------------------
16 n, i = 10, 11
17 n, i = 8, 11
18 n, i = 11, 11
19 n, i = 11, 11
20 n, i = 4, 11
21 left_hands = [10, 8, 4]
22 ---------------------------------
23 n, i = 10, 11
24 n, i = 8, 11
25 n, i = 11, 11
26 n, i = 11, 11
27 n, i = 4, 11
28 left_hands = [10, 8, 4]
29 ---------------------------------
30 n, i = 10, 4
31 n, i = 8, 4
32 n, i = 11, 4
33 n, i = 11, 4
34 n, i = 4, 4
35 left_hands = [10, 8, 11, 11]
36 ---------------------------------
37 ONE PAIR
追記
count_j
が必要な理由
その次にleft_handsの4個のリストをforで回してjにいれて、
list_handsの値(10,8,11,11,4)にjがいくつ含まれているのかカウントしていますが、
なぜcount_jが必要なのでしょうか??
3週目の11の場合、
list_handsにjの値がいくつあるかカウントして、
1,2,2,1,1,2,2~がcount_jに代入される→
「別の数
をちょうど 2 つ含」んでいないかを調べるためです
この問題は次のことを求めています:
配られた5枚のカードが、以下のいずれの役に該当するかを調べてください。
役名 条件 FULL HOUSE ある数
をちょうど 3 つと、別の数
をちょうど 2 つ含むFOUR CARD ある数
をちょうど 4 つ含むTHREE CARD ある数
をちょうど 3 つ含むTWO PAIR ある数
をちょうど 2 つと、別の数
をちょうど 2 つ含むONE PAIR ある数
をちょうど 2 つ含む
この Python コードでは、
ある数
をいくつ含むかを調べて count_i
に代入したあと、
別の数
をいくつ含むかを調べて count_j
に代入しています
そして、その count_i
, count_j
を使って、
次の if
, elif
, else
ブロックで役の判定を行っています:
python
1 if count_i == 2 and count_j < 2 :
2 results . append ( 1 ) # ONE PAIR
3 elif count_i == 2 and count_j == 2 :
4 results . append ( 2 ) # TWO PAIR
5 elif count_i == 3 and count_j == 1 :
6 results . append ( 3 ) # THREE CARD
7 elif count_i == 4 and count_j == 1 :
8 results . append ( 4 ) # FOUR CARD
9 elif count_i == 3 and count_j == 2 :
10 results . append ( 5 ) # FULL HOUSE
11 else :
12 results . append ( 0 ) # NO PAIR
残りの手札を作る理由
なぜ カード X の数字を除いた残りの手札、を作る必要があるのでしょうか?
もし、別の数
をいくつ含む処理の前に
カード X
の数字を除いた残りの手札を作らなければ、
カード Y
を選ぶときに
カード X
と同じ数字を選んでしまう可能性があります
すると、たとえば ONE PAIR
でも TWO PAIR
と判定されてしまいます
例では 5 枚のカードとして 10
8
11
11
4
が与えられています
ここで、カード X
もカード Y
も 11
を選んでしまうと
11
の枚数は 2 枚なので判定が TWO PAIR
になってしまいます
実験
list_hands
ではなく left_hands
からカード Y
を選ぶとどうなるか見てみましょう:
python
1 def check_hand ( a , b , c , d , e ) :
2 list_hands = [ a , b , c , d , e ]
3 dict_hands = { 0 : "NO PAIR" , 1 : "ONE PAIR" , 2 : "TWO PAIR" , 3 : "THREE CARD" , 4 : "FOUR CARD" , 5 : "FULL HOUSE" }
4 results = [ ]
5
6 for i in list_hands : #カードXを選ぶ
7 count_i = list_hands . count ( i ) #手札の中にあるカードXの個数をカウント
8
9 # left_hands = [n for n in list_hands if n != i] #Xの数字を除いた残りの手札
10 # left_hands = []
11 # for n in list_hands:
12 # # ↓ この時点での n, i の値を確認します
13 # print('n, i = ' + str(n) + ', ' + str(i))
14 # if n != i:
15 # left_hands.append(n)
16 # # ↓ left_hands の値を確認します
17 # print('left_hands = ' + str(left_hands))
18 # print('---------------------------------')
19 # for j in left_hands:#X以外の数字のカードからカードYを選ぶ
20 for j in list_hands : #X以外の数字のカードからカードYを選ぶ
21 count_j = list_hands . count ( j ) #手札の中にあるカードYの個数をカウント
22 print ( "カードX, Y = " + str ( i ) + ", " + str ( j ) )
23 print ( "個数 X, Y = " + str ( count_i ) + ", " + str ( count_j ) )
24 if count_i == 2 and count_j < 2 :
25 print ( "ONE PAIR" )
26 results . append ( 1 )
27 elif count_i == 2 and count_j == 2 :
28 print ( "TWO PAIR" )
29 results . append ( 2 )
30 elif count_i == 3 and count_j == 1 :
31 print ( "THREE CARD" )
32 results . append ( 3 )
33 elif count_i == 4 and count_j == 1 :
34 print ( "FOUR CARD" )
35 results . append ( 4 )
36 elif count_i == 3 and count_j == 2 :
37 print ( "FULL HOUSE" )
38 results . append ( 5 )
39 else :
40 print ( "NO PAIR" )
41 results . append ( 0 )
42 print ( '---------------------------------' )
43 result = max ( results )
44 return dict_hands [ result ]
45
46 print ( check_hand ( 10 , 8 , 11 , 11 , 4 ) )
実行結果:
console
1 $ python test.py
2 カードX, Y = 10, 10
3 個数 X, Y = 1, 1
4 NO PAIR
5 ---------------------------------
6 カードX, Y = 10, 8
7 個数 X, Y = 1, 1
8 NO PAIR
9 ---------------------------------
10 カードX, Y = 10, 11
11 個数 X, Y = 1, 2
12 NO PAIR
13 ---------------------------------
14 カードX, Y = 10, 11
15 個数 X, Y = 1, 2
16 NO PAIR
17 ---------------------------------
18 カードX, Y = 10, 4
19 個数 X, Y = 1, 1
20 NO PAIR
21 ---------------------------------
22 カードX, Y = 8, 10
23 個数 X, Y = 1, 1
24 NO PAIR
25 ---------------------------------
26 カードX, Y = 8, 8
27 個数 X, Y = 1, 1
28 NO PAIR
29 ---------------------------------
30 カードX, Y = 8, 11
31 個数 X, Y = 1, 2
32 NO PAIR
33 ---------------------------------
34 カードX, Y = 8, 11
35 個数 X, Y = 1, 2
36 NO PAIR
37 ---------------------------------
38 カードX, Y = 8, 4
39 個数 X, Y = 1, 1
40 NO PAIR
41 ---------------------------------
42 カードX, Y = 11, 10
43 個数 X, Y = 2, 1
44 ONE PAIR
45 ---------------------------------
46 カードX, Y = 11, 8
47 個数 X, Y = 2, 1
48 ONE PAIR
49 ---------------------------------
50 カードX, Y = 11, 11
51 個数 X, Y = 2, 2
52 TWO PAIR
53 ---------------------------------
54 カードX, Y = 11, 11
55 個数 X, Y = 2, 2
56 TWO PAIR
57 ---------------------------------
58 カードX, Y = 11, 4
59 個数 X, Y = 2, 1
60 ONE PAIR
61 ---------------------------------
62 カードX, Y = 11, 10
63 個数 X, Y = 2, 1
64 ONE PAIR
65 ---------------------------------
66 カードX, Y = 11, 8
67 個数 X, Y = 2, 1
68 ONE PAIR
69 ---------------------------------
70 カードX, Y = 11, 11
71 個数 X, Y = 2, 2
72 TWO PAIR
73 ---------------------------------
74 カードX, Y = 11, 11
75 個数 X, Y = 2, 2
76 TWO PAIR
77 ---------------------------------
78 カードX, Y = 11, 4
79 個数 X, Y = 2, 1
80 ONE PAIR
81 ---------------------------------
82 カードX, Y = 4, 10
83 個数 X, Y = 1, 1
84 NO PAIR
85 ---------------------------------
86 カードX, Y = 4, 8
87 個数 X, Y = 1, 1
88 NO PAIR
89 ---------------------------------
90 カードX, Y = 4, 11
91 個数 X, Y = 1, 2
92 NO PAIR
93 ---------------------------------
94 カードX, Y = 4, 11
95 個数 X, Y = 1, 2
96 NO PAIR
97 ---------------------------------
98 カードX, Y = 4, 4
99 個数 X, Y = 1, 1
100 NO PAIR
101 ---------------------------------
102 TWO PAIR
count_i
と count_j
による役の評価について
なぜXの数字を除いた手札×4を作ることによって、
カードXでペアになっていたもの(11,11)を除けるのでしょうか?
-(10,8,11,11,4)の場合-
count_i = 1,1,2,2,1
count_j = 1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2
if count_i ==2 and count_j < 2
この役はワンペアですが、
count_j == 2となるのでツーペアになると思ったのですが、
なぜcount_j < 2となるのでしょうか?
上記 [残りの手札を作る理由] [検証] の実行結果で見たように、
役の判定において count_i
と count_j
は
「別々の統計 が評価されている」のではなく、
「組み合わせ ごとに評価されています」
-(10,8,11,11,4)の場合-
count_i = 1,1,2,2,1
count_j = 1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2
この、別々の統計 を取るような認識が正しくありません、
次のように組み合わせ でとらえる必要があります:
-(10,8,11,11,4)の場合-
count_i
|count_j
|役
---|---
1|1|NO PAIR
1|1|NO PAIR
1|2|NO PAIR
1|2|NO PAIR
1|1|NO PAIR
1|1|NO PAIR
1|1|NO PAIR
1|2|NO PAIR
1|2|NO PAIR
1|1|NO PAIR
2|1|ONE PAIR
2|1|ONE PAIR
2|2|TWO PAIR
2|2|TWO PAIR
2|1|ONE PAIR
2|1|ONE PAIR
2|1|ONE PAIR
2|2|TWO PAIR
2|2|TWO PAIR
2|1|ONE PAIR
1|1|NO PAIR
1|1|NO PAIR
1|2|NO PAIR
1|2|NO PAIR
1|1|NO PAIR
最後に最大の役を調べると、TWO PAIR
となります
最大の役を調べているコードは次の箇所です:
python
1 result = max ( results )
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/01 08:20
2020/07/01 08:57
2020/07/02 05:16
2020/07/02 05:37
2020/07/02 06:10
2020/07/02 08:09 編集
2020/07/02 08:06
2020/07/02 08:46 編集
2020/07/02 09:22
2020/07/04 03:49
2020/07/04 04:02
2020/07/05 03:10 編集
2020/07/05 04:01 編集
2020/07/05 04:07
2020/07/05 04:22 編集
2020/07/05 04:24
2020/07/05 04:40