Python 비교 카드 크기 프로그램 코드 예시 실현
먼저 거시적 으로 사고방식 을 파악 해 보 자.목적 은 텍 사 스 포커 의 크기 를 비교 하 는 문 제 를 만 드 는 것 이다
우선,먼저 처리 함 수 를 추상 화하 여 반환 값 의 크기 에 따라 결 과 를 제시한다.
그 다음 에 우 리 는 두 개 또는 여러 개의 카드 의 크기 를 어떻게 비교 하 는 지 정의 하고 크기 를 비교 하기 위해 우 리 는 먼저 5 장의 카드 를 예비 처리 하고 이 를 내림차 순 으로 정렬 합 니 다.다음 과 같 습 니 다.
def card_ranks(hand):
ranks = ['--23456789TJQKA'.INDEX(r) for r, s in hand]
ranks.sort(reverse=True)
return ranks
그 다음 에 우 리 는 모두 9 가지 상황 을 들 고 숫자 로 모든 상황 의 등급 을 대표 하 며 Python 의 비교 기능 을 이용 하여 등급 을 1 위 에 놓 고 등급 이 같 으 면 뒤의 것 을 비교 할 수 있다.
def hand_rank(hand):
"Return a value indicating the ranking of a hand."
ranks = card_ranks(hand)
if straight(ranks) and flush(hand):
return (8, max(ranks))
elif kind(4, ranks):
return (7, kind(4, ranks), kind(1, ranks))
elif kind(3, ranks) and kind(2, ranks):
return (6, kind(3, ranks), kind(2, ranks))
elif flush(hand):
return (5, ranks)
elif straight(ranks):
return (4, max(ranks))
elif kind(3, ranks):
return (3, kind(3, ranks), ranks)
elif two_pair(ranks):
return (2, two_pair(ranks), ranks)
elif kind(2, ranks):
return (1, kind(2, ranks), ranks)
else:
return (0, ranks)
등급 이 같 으 면 각 세트 에서 카드 의 크기 를 비교 하 는 것 을 볼 수 있다.동시에 우 리 는 세 개의 함수 가 필요 합 니 다.동화,순자,그리고 kind(n,ranks)를 대표 하고 ranks 가 n 장의 카드 를 가 진 포 인 트 를 대표 합 니 다.이곳 의 세 가지 함 수 는 매우 교묘 하 게 실현 되 었 고 set 의 무 거 운 특성 을 이용 하 였 다.
def straight(ranks):
return (max(ranks) - min(ranks)) == 4 and len(set(ranks)) == 5
def flush(hand):
suit = [s, for r, s in hand]
return len(set(suit)) == 1
def kind(n, ranks):
for s in ranks:
if ranks.count(s) == n : return s
return None
우 리 는 두 개의 쌍 을 포함 하고 있 기 때문에 하나의 함수 가 이러한 상황 인지 아 닌 지 를 판단 해 야 한 다 는 것 을 알 게 되 었 습 니 다.이 함수 에서 kind()함 수 를 호출 했 습 니 다.kind()함수 가 단락 특성 을 만족 시 키 기 때문에 먼저 얻 은 만족 상황 의 포인트 만 되 돌려 주 었 습 니 다.그래서 이 를 뒤 집 은 후에 한쪽 kind 를 호출 했 습 니 다.만약 에 얻 은 결과 가 같 으 면 한 쌍(또는 없 음)만 있 습 니 다.안 그러면 두 개 야.
def two_pairs(ranks):
pair = kind(2, ranks)
lowpair = kind(2, list(reverse(ranks)))
if pair != lowpair:
return (pair, lowpair)
else:
return None
자,전체적인 뼈 대 를 다 만 든 셈 입 니 다.그 다음 에 처리 하면 bug 가 발생 할 수 있 습 니 다.먼저 A2345 입 니 다.정렬 할 때 A 가 14 로 계산 되 기 때문에 이 문제 에 대해 단독으로 if 를 열거 해 야 합 니 다.
A :
def card_ranks(hand):
ranks = ['--23456789TJQKA'.INDEX(r) for r, s in hand]
ranks.sort(reverse=True)
return [5, 4, 3, 2, 1] if (ranks = [14, 5, 4, 3, 2] else ranks
그 다음 에 더욱 간소화 되 었 고 생각 이 좋 았 다.
def poker(hands):
return allmax(hands, key=hand_ranks)
def allmax(iterable, key=None):
result, maxval = [], None
ket = key or lambda(x): x
for x in iterable:
xval = key(x)
if not result or xval > maxval:
result, maxval = [x], xval
elif:
result.append(x)
return result
""" , , """
import random
mydeck = [r+s for r in '23456789TJKQA' for s in'SHDC]
def deal(numhands, n=5, deck = [r+s for r in '23456789TJKQA' for s in'SHDC]):
random.shuffle(deck)
return [deck[n*i:n*(i + 1)] for i in range(numhands)]
def hand_ranks(hand):
groups = group['--23456789TJQKA'.index(r) for r, s in hand]
counts, ranks = unzip(groups)
if rnaks == (14, 5, 4, 3, 2, 1):
ransk = (5, 4, 3, 2, 1)
straight = len(ranks) == 5 and max(ranks) - min(ranks) == 4
flush = len(set([s for r, s in hand])) ==1
return(9 if (5,) == count else
8 if straight and flush else
7 if (4, 1) == counts else
6 if (3, 2) == counts else
5 if flush else
4 if straight else
3 if (3, 1, 1) == counts else
2 if (5, 1, 1) == counts else
1 if (2, 1, 1, 1) == counts else
0), ranks
def group(items):
groups = [(items.count(x), x) for x in set(items)]
return sorted(groups, reverse = True)
def unzips(pairs):return zip(*pairs)
def hand_ranks(hand):
groups = group['--23456789TJQKA'.index(r) for r, s in hand]
counts, ranks = unzip(groups)
if rnaks == (14, 5, 4, 3, 2, 1):
ransk = (5, 4, 3, 2, 1)
straight = len(ranks) == 5 and max(ranks) - min(ranks) == 4
flush = len(set([s for r, s in hand])) ==1
return max(count_ranks[counts], 4*straight + 5 * flush), ranks
count_rankings = {(5,):10, (4, 1):7, (3,2):6, (3,1,1):3, (2,2,1):2,
(2,1,1,1): 1,(1,1,1,1,1):0}
정리 한 다음 에 한 문제 에 직면 하 는 사고 절차:
started:understand problems look at specification See if it make sense
define the piece of problem reuse the piece you have test! >explore
correctness elegance efficienct featrues
총결산이상 은 파 이 썬 이 카드 크기 프로그램 코드 예 시 를 비교 하 는 데 도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사 이 트 를 계속 참고 할 수 있 습 니 다.
Python 3 간단 한 실례 계산 동화 확률 코드
Python 언어 설명 최대 연속 서브 시퀀스 와
Python 데이터 시각 화 정상 분포 단순 분석 및 구현 코드
부족 한 점 이 있 으 면 댓 글로 지적 해 주세요.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.