Created
December 7, 2018 12:09
-
-
Save YSRKEN/f3cff29dd2da147858bd1e6c1a60d649 to your computer and use it in GitHub Desktop.
「大石泉すきポーカー」の役判定プログラムをPythonで書きました ref: https://qiita.com/YSRKEN/items/262040d07e7e343bc70e
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import itertools | |
import collections | |
from typing import List | |
def judge_hand(name : str) -> str: | |
"""手役を判定する | |
Parameters | |
---------- | |
name : str | |
「大石泉すき」から重複を許して5文字取って並べたもの | |
Returns | |
------- | |
str | |
判定された役 | |
""" | |
# 各文字をバラす | |
name_char = list(name) | |
# 各文字の出現回数を数え、出現回数部分だけ抽出したもの。 | |
# 例:「大大すすき」→[2, 2, 1] | |
char_count = collections.Counter(name_char).values() | |
# 手役の判定処理 | |
if name == '大石泉すき': | |
# 説明不要 | |
return 'ロイヤルストレートフラッシュ' | |
elif len(set(name_char)) == 1: | |
# uniq処理を施して1つしか残らない=ファイブカード | |
return 'ファイブカード' | |
elif 4 in char_count: | |
# ある文字が4つある=フォーカード | |
return 'フォーカード' | |
elif len(char_count) == 5: | |
# 5種類ある=元の文字列が5文字なので各文字ある=ストレートフラッシュ | |
return 'ストレートフラッシュ' | |
elif 2 in char_count and 3 in char_count: | |
# 出現回数に「2」と「3」がある=フルハウス | |
return 'フルハウス' | |
elif 'すき' in name: | |
# すき | |
return 'すき' | |
elif 3 in char_count: | |
# 出現回数に「3」がある=スリーカード | |
return 'スリーカード' | |
elif 2 in char_count and len(char_count) == 3: | |
# 出現回数が3文字分あって「2」が含まれる=消去法からツーペア | |
return 'ツーペア' | |
return 'ブタ' | |
# メインルーチン | |
if __name__ == '__main__': | |
# 使用する文字の種類 | |
chars = '大石泉すき' | |
# itertools.productを利用して、重複順列を作り出し、1セットづつname_charに取り出す | |
for name_char in itertools.product(chars, repeat=5): | |
# name_charの全文字を結合したものをnameとする | |
name = ''.join(name_char) | |
# 判定を行い、結果を表示する | |
print(f"{name} {judge_hand(name)}") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
if __name__ == '__main__': | |
# 使用する文字の種類 | |
chars = '大石泉すき' | |
# itertools.productを利用して、重複順列を作り出し、1セットづつname_charに取り出す | |
temp = [] | |
for name_char in itertools.product(chars, repeat=5): | |
# name_charの全文字を結合したものをnameとする | |
name = ''.join(name_char) | |
# 判定を行い、結果を格納する | |
temp.append(judge_hand(name)) | |
# カウントした結果を表示する | |
from pprint import pprint | |
pprint(collections.Counter(temp)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
大大大大大 ファイブカード | |
大大大大石 フォーカード | |
大大大大泉 フォーカード | |
(中略) | |
大石泉すす ブタ | |
大石泉すき ロイヤルストレートフラッシュ | |
大石泉き大 ブタ | |
(中略) | |
きききき泉 フォーカード | |
ききききす フォーカード | |
ききききき ファイブカード |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Counter({'ブタ': 984, | |
'ツーペア': 765, | |
'スリーカード': 516, | |
'すき': 435, | |
'フルハウス': 200, | |
'ストレートフラッシュ': 119, | |
'フォーカード': 100, | |
'ファイブカード': 5, | |
'ロイヤルストレートフラッシュ': 1}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment