포커라는 카드게임은 다섯 장으로 된 패의 높고 낮음에 따라 승부를 냅니다. (포커 규칙을 이미 아는 분이라면 규칙 설명 부분은 건너뛰셔도 좋습니다)
카드 한 장은 아래와 같은 순서대로 값이 높아집니다.
2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A다섯 장으로 이루어진 패의 계급(세칭 "족보")은, 낮은 것부터 높은 순서로 아래와 같습니다.
- High Card : 가장 높은 카드의 값으로 비교.
- One Pair : 한 쌍이 같은 카드.
- Two Pairs : 서로 다른 두 쌍이 같은 카드.
- Three of a Kind : 세 장이 같은 카드.
- Straight : 모든 카드가 연속된 숫자.
- Flush : 모든 카드의 무늬가 같음.
- Full House : 세 장이 같고, 또 한 쌍이 같음 (Three of a Kind + One Pair).
- Four of a Kind : 네 장이 같은 카드.
- Straight Flush : 모든 카드가 연속된 숫자이면서 무늬도 같음.
- Royal Flush : 10, J, Q, K, A가 무늬도 같음.
두 사람의 패가 같은 종류의 계급이라면, 계급을 구성하는 카드 중 높은 쪽을 쥔 사람이 이깁니다. 예를 들면 8 원페어는 5 원페어를 이깁니다.
계급을 이루는 카드 숫자까지 같으면 (예: 둘 다 Q 원페어), 다른 카드를 높은 순서대로 비교해서 승부를 정합니다.
텍스트파일 poker.txt 에는 두 선수가 벌인 1,000회의 승부가 저장되어 있습니다. (우클릭해서 다운로드 받으세요)
한 줄에는 10장의 카드가 공백으로 분리되어 들어있는데, 앞의 다섯 장은 1번 선수 것이고 뒤의 다섯 장은 2번 선수의 패입니다. 잘못되거나 중복된 데이터는 없으며, 무승부도 없습니다.
카드 숫자는 2, 3, ... , 9, T, J, Q, K, A 로 (숫자 10은 T로 표시),
무늬는 C (Club - ♣), D (Diamond - ♦), H (Heart - ♥), S (Spade - ♠) 로 표시되어 있습니다.
예를 들면 3C 3D 3S 9S 9D 의 경우 3 풀하우스가 됩니다.
이 데이터를 분석하고, 1번 선수가 이긴 횟수를 구하세요.
새벽내내 이거 가지고 씨름.. 풀긴했는데 어찌 풀었나..--;
이건 루비랑 펄로 안 풀꺼임.
def is_royal_flush(nums, marks): | |
number="".join(str(n) for n in nums) | |
mark_set = set(marks) | |
if number == "1011121314" and len(mark_set) == 1: | |
return (True, nums[4]) | |
else: | |
return (False, nums[4]) | |
def is_st_flush(nums, marks): | |
mark_set = set(marks) | |
for i in range(0,4): | |
if not (int(nums[i+1]) - int(nums[i])) == 1: | |
return (False, nums[4]) | |
if len(mark_set) == 1: | |
return (True, nums[4]) | |
return (False, nums[4]) | |
def is_fourcard(nums, marks): | |
same_cnt = dict() | |
for n in nums: | |
if n in same_cnt: | |
same_cnt[n] = same_cnt[n] + 1 | |
else: | |
same_cnt[n] = 1 | |
for k in same_cnt: | |
if same_cnt[k] == 4: | |
return (True, k) | |
return (False, nums[4]) | |
def is_fullhouse(nums, marks): | |
same_cnt = dict() | |
nums_set = set(nums) | |
for n in nums: | |
if n in same_cnt: | |
same_cnt[n] = same_cnt[n] + 1 | |
else: | |
same_cnt[n] = 1 | |
if len(nums_set) == 2: | |
for k in same_cnt: | |
if same_cnt[k] == 2 or same_cnt[k] == 3: | |
return (True, k) | |
return (False, nums[4]) | |
def is_fulsh(nums, marks): | |
mark_set = set(marks) | |
if len(mark_set) == 1: | |
return (True, nums[4]) | |
return (False, nums[4]) | |
def is_st(nums, marks): | |
for i in range(0,4): | |
if not (int(nums[i+1]) - int(nums[i])) == 1: | |
return (False, nums[4]) | |
return (True, nums[4]) | |
def is_three_of_kind(nums, marks): | |
same_cnt = dict() | |
for n in nums: | |
if n in same_cnt: | |
same_cnt[n] = same_cnt[n] + 1 | |
else: | |
same_cnt[n] = 1 | |
for k in same_cnt: | |
if same_cnt[k] == 3: | |
return (True, k) | |
return (False, nums[4]) | |
def is_two_pairs(nums, marks): | |
same_cnt = dict() | |
nums_set = set(nums) | |
for n in nums: | |
if n in same_cnt: | |
same_cnt[n] = same_cnt[n] + 1 | |
else: | |
same_cnt[n] = 1 | |
if len(nums_set) == 3: | |
for k in same_cnt: | |
if same_cnt[k] == 2: | |
return (True, k) | |
return (False, nums[4]) | |
def is_one_pair(nums, marks): | |
same_cnt = dict() | |
nums_set = set(nums) | |
for n in nums: | |
if n in same_cnt: | |
same_cnt[n] = same_cnt[n] + 1 | |
else: | |
same_cnt[n] = 1 | |
if len(nums_set) == 4: | |
for k in same_cnt: | |
if same_cnt[k] == 2: | |
return (True, k) | |
return (False, nums[4]) | |
def get_grade(nums, marks): | |
if is_royal_flush(nums, marks)[0]: | |
return (10, is_royal_flush(nums, marks)[1]) | |
elif is_st_flush(nums, marks)[0]: | |
return (9, is_st_flush(nums, marks)[1]) | |
elif is_fourcard(nums, marks)[0]: | |
return (8, is_fourcard(nums, marks)[1]) | |
elif is_fullhouse(nums, marks)[0]: | |
return (7, is_fullhouse(nums, marks)[1]) | |
elif is_fulsh(nums, marks)[0]: | |
return (6, is_fulsh(nums, marks)[1]) | |
elif is_st(nums, marks)[0]: | |
return (5, is_st(nums, marks)[1]) | |
elif is_three_of_kind(nums, marks)[0]: | |
return (4, is_three_of_kind(nums, marks)[1]) | |
elif is_two_pairs(nums, marks)[0]: | |
return (3, is_two_pairs(nums, marks)[1]) | |
elif is_one_pair(nums, marks)[0]: | |
return (2, is_one_pair(nums, marks)[1]) | |
return (1, 0) | |
poker_txt=open("poker.txt", "r") | |
mark_num_map = {'T':10, 'J':11, 'Q':12, 'K':13, 'A':14} | |
p1_win_cnt = 0 | |
p2_win_cnt = 0 | |
for line in poker_txt: | |
line_str = line.rstrip("\n") | |
game_str = line_str.split(" ") | |
p1_cards_nums = [] | |
p1_cards_marks = [] | |
p2_cards_nums = [] | |
p2_cards_marks = [] | |
for i in range(0, 5): | |
p1_num = game_str[i][0:len(game_str[i])-1] | |
p1_mark = game_str[i][len(game_str[i])-1:len(game_str[i])] | |
if p1_num in mark_num_map: | |
p1_num = mark_num_map[p1_num] | |
p1_cards_nums.append(int(p1_num)) | |
p1_cards_marks.append(p1_mark) | |
p2_num = game_str[i+5][0:len(game_str[i+5])-1] | |
p2_mark = game_str[i+5][len(game_str[i+5])-1:len(game_str[i+5])] | |
if p2_num in mark_num_map: | |
p2_num = mark_num_map[p2_num] | |
p2_cards_nums.append(int(p2_num)) | |
p2_cards_marks.append(p2_mark) | |
p1_cards_nums.sort() | |
p2_cards_nums.sort() | |
if get_grade(p1_cards_nums, p1_cards_marks)[0] > get_grade(p2_cards_nums, p2_cards_marks)[0]: | |
p1_win_cnt += 1 | |
elif get_grade(p1_cards_nums, p1_cards_marks)[0] == get_grade(p2_cards_nums, p2_cards_marks)[0]: | |
if get_grade(p1_cards_nums, p1_cards_marks)[1] > get_grade(p2_cards_nums, p2_cards_marks)[1]: | |
p1_win_cnt += 1 | |
elif get_grade(p1_cards_nums, p1_cards_marks)[1] == get_grade(p2_cards_nums, p2_cards_marks)[1]: | |
for i in range(0, 5): | |
if p1_cards_nums[4-i] > p2_cards_nums[4-i]: | |
p1_win_cnt += 1 | |
break | |
elif p1_cards_nums[4-i] == p2_cards_nums[4-i]: | |
continue | |
else: | |
p2_win_cnt += 1 | |
break | |
else: | |
p2_win_cnt += 1 | |
else: | |
p2_win_cnt += 1 | |
print (p1_win_cnt) | |
print (p2_win_cnt) | |
print (t) |