Skip to content

Instantly share code, notes, and snippets.

@YSRKEN
Created December 7, 2018 12:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YSRKEN/f3cff29dd2da147858bd1e6c1a60d649 to your computer and use it in GitHub Desktop.
Save YSRKEN/f3cff29dd2da147858bd1e6c1a60d649 to your computer and use it in GitHub Desktop.
「大石泉すきポーカー」の役判定プログラムをPythonで書きました ref: https://qiita.com/YSRKEN/items/262040d07e7e343bc70e
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)}")
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))
大大大大大 ファイブカード
大大大大石 フォーカード
大大大大泉 フォーカード
(中略)
大石泉すす ブタ
大石泉すき ロイヤルストレートフラッシュ
大石泉き大 ブタ
(中略)
きききき泉 フォーカード
ききききす フォーカード
ききききき ファイブカード
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