Sep-03-2021, 06:04 PM
(Sep-03-2021, 04:54 AM)bowlofred Wrote: Your first function logic assumes that all straights are either a,b,c,d,e; b,c,d,e,f; or c,d,e,f,g. So those are the only possibilities you try. And if the list were sorted, that would be correct.
But because this list is not sorted, your straight is actually made of the cards: a,b,c,d,g. Because g is smaller than the others, it isn't detected.
If you convert to int before you sort, it works for some cases, but you have other problems.
123456def
checksuiteinplayershand(playershand, possiblesuite):
suite
=
[[
int
(r), s]
for
r,s
in
playershand]
suite.sort()
a
=
int
(suite[
0
][
0
])
b
=
int
(suite[
1
][
0
])
...
But what would happen if the hand were 5, 10, 11, 12, 12, 12, 13? You wouldn't have a straight, but your function would say you did. You need to not only sort them, you need to remove duplicates. A set is a good way to do that. (you're sort of checking for duplicates, but incompletely)
Output:$ python3 pokerhand.py [['7', 'h'], ['5', 'h']] [['13', 'h'], ['10', 'h'], ['12', 'h'], ['11', 'h'], ['9', 'h']] [['7', 'h'], ['5', 'h'], ['13', 'h'], ['10', 'h'], ['12', 'h'], ['11', 'h'], ['9', 'h']] checksuiteinplayershand: (True, 13)
What I might do to detect a straight would be:
* sort all the unique ranks
* see if the card 4 slots away has a rank 4 less than the current card
1234567891011121314151617181920212223242526272829303132hands
=
[
[[
1
,
"s"
], [
2
,
"s"
], [
3
,
"s"
], [
4
,
"s"
], [
7
,
"s"
], [
8
,
"s"
], [
9
,
"s"
]],
# not a straight
[[
2
,
"s"
], [
8
,
"s"
], [
5
,
"s"
], [
7
,
"s"
], [
6
,
"s"
], [
10
,
"s"
], [
4
,
"s"
]],
# straight
[[
1
,
"s"
], [
10
,
"s"
], [
11
,
"s"
], [
3
,
"s"
], [
12
,
"s"
], [
3
,
"h"
], [
13
,
"s"
]],
# straight (ace high)
[[
2
,
"s"
], [
2
,
"h"
], [
5
,
"s"
], [
5
,
"h"
], [
4
,
"s"
], [
6
,
"s"
], [
3
,
"s"
]],
# straight (duplicate cards)
]
def
is_a_straight(hand):
"""Looks for straight in set of hands. Returns top card of highest straight"""
size_straight
=
5
# must have this many in a row
# if we reverse sort, we'll find the highest straight when going front to back.
sorted_ranks
=
sorted
({x[
0
]
for
x
in
hand}, reverse
=
True
)
if
len
(sorted_ranks) < size_straight:
# can't be a straight
return
None
for
start
in
range
(
len
(sorted_ranks)
-
size_straight
+
1
):
if
sorted_ranks[start]
-
sorted_ranks[start
+
size_straight
-
1
]
=
=
size_straight
-
1
:
return
sorted_ranks[start]
# Check for ace_high
if
1
in
sorted_ranks:
new_hand
=
[h
for
h
in
hand
if
h[
0
] !
=
1
]
new_hand.append([
14
,
"x"
])
return
is_a_straight(new_hand)
for
hand
in
hands:
(is_a_straight(hand))
Output:None 8 14 6
Yeah, i did what you said and it works, but I still don't get why thy function return 'None'. the return statement of the function was "return possiblesuite, a" possiblesuite was set to False outside the function. So when the if statement didn't encounter a straight, because it sorted the list this way : ['10', 'h'], ['11','h'], ['12','h'],['13','h'],['9', 'h'] it should've returned False but instead it returned 'None'. Doesn't that happened only when a boolean value isn't set like possiblesuite = bool ? But mine was set to False...