# 麻雀清一色待ち判定機
## コード
```python:main.py
#main.py
import haipai
import tiletxt
import hantei
import sys
import time
if __name__=="__main__":
while True:
tehai = haipai.randhaipai()
machi = hantei.machi(tehai)
if machi.count(0) != 9:
break
break
#tehai = [3,1,1,1,1,1,1,1,3]
print("配牌を1~9の文字13個で構成してください。")
txt = input()
if len(txt) != 13:
print("配牌が13牌ではありません。{}牌になっています。".format(len(txt)) )
sys.exit()
start = time.time()
tehai = tiletxt.tiletxt_input(txt)
machi = hantei.machi(tehai)
tehai_txt = tiletxt.tiletxt(tehai)
machi_normal_txt = tiletxt.tiletxt(machi[0])
machi_imas_txt = tiletxt.tiletxt(machi[1])
end = time.time()
print("手牌 : " + tehai_txt)
print("普通待ち : " + machi_normal_txt)
print("アイマス待ち: " + machi_imas_txt)
print("実行時間 : " + str(end-start))
```
```python:tiletxt.py
#tiletxt.py
def tiletxt(tehai):
txt = ""
for i in range(9):
if tehai[i] > 0:
txt += (str(i+1) * tehai[i])
return txt
def tiletxt_input(txt):
tehai = [0]*9
for i in range(len(txt)):
n = int(txt[i])
tehai[n-1] += 1
return tehai
```
```python:hantei.py
#hantei.py
import copy
def machi(tehai):
mentsu_list_normal = []
for i in range(9):
mentsu = []
for j in range(9):
if j==i:
mentsu.append(3)
else:
mentsu.append(0)
mentsu_list_normal.append(mentsu)
for i in range(7):
mentsu = []
for j in range(9):
if j==i or j-1==i or j-2==i:
mentsu.append(1)
else:
mentsu.append(0)
mentsu_list_normal.append(mentsu)
mentsu_list_imas = [
[0,0,0,0,1,1,1,0,0], #765
[0,0,0,0,0,1,1,1,0], #876
[0,0,1,1,0,1,0,0,0], #346
[1,0,1,0,1,0,0,0,0], #315
[0,1,1,0,0,0,0,1,0], #283
[1,0,0,0,0,1,0,0,1], #961
]
machihai_normal = []
machihai_imas = []
for i in range(9):
#print("待ち牌" + str(i+1))
machiflag = [0,0]
tehai_tsumo = copy.copy(tehai)
if tehai_tsumo[i] <= 3: #該当の持ち牌が3枚以下であることが条件
tehai_tsumo[i] = tehai_tsumo[i] + 1
else:
machihai_normal.append(0)
continue
if tehai_tsumo.count(2) == 7:
machiflag[0] = 1
if mentsukei(tehai_tsumo,mentsu_list_normal,0,4):
machiflag[0] = 1
if mentsukei(tehai_tsumo,mentsu_list_imas,0,4):
machiflag[1] = 1
machihai_normal.append(machiflag[0])
machihai_imas.append(machiflag[1])
return [machihai_normal,machihai_imas]
# tehai ... 14枚の手牌
# mentsu_list ... 面子リスト 刻子が[3,0,0,0,0,0,0,0,0]など 順子が[1,1,1,0,0,0,0,0,0]などの形で保管
# num ... 面子リストの何個目まで確認したか
# times ... 面子が何個分残っているか
def mentsukei(tehai,mentsu_list,num,times):
#print(str(tehai) + " num=" + str(num) + " times=" + str(times))
if times == 0 and tehai.count(2) == 1: #雀頭が残ってる つまり[2,0,0,0,0,0,0,0,0]とかだったらTrue
return True
elif times == 0:
return False
elif num == len(mentsu_list): #面子リスト
return False
mentsu = mentsu_list[num]
flag_a = False
if tehai_minus_hantei(tehai,mentsu): #tehai-mentsuをすることができるか?
new_tehai = tehai_minus(tehai,mentsu)
flag_a = mentsukei(new_tehai,mentsu_list,num,times-1)
flag_b = mentsukei(tehai,mentsu_list,num+1,times)
if flag_a or flag_b:
return True
"""
for mentsu in mentsu_list[num:]:
if tehai_minus_hantei(tehai,mentsu): #tehai-mentsuをすることができるか?
new_tehai = tehai_minus(tehai,mentsu)
flag_a = mentsukei(new_tehai,mentsu_list,num,times-1)
flag_b = mentsukei(tehai,mentsu_list,num+1,times)
if flag_a or flag_b:
return True
num += 1
return False
"""
def tehai_minus(tehai , mentsu):
a=[]
for i in range(9):
a.append(tehai[i] - mentsu[i])
return a
def tehai_minus_hantei(tehai , mentsu):
flag = True
for i in range(9):
if tehai[i] < mentsu[i]:
flag = False
return flag
```
```python:haipai.py
#haipai.py
import random
def randhaipai():
tehai = [0]*9
for times in range(13):
while True:
x = random.randint(0, 8)
if tehai[x] <= 3:
tehai[x] += 1
break
return tehai
def randhaipai_shuffle():
tehai = [0]*9
randpai = list(range(9))*4
for _ in range(13):
n =random.randrange(len(randpai))
tehai[randpai[n]] += 1
del randpai[n]
return tehai
```