読書・NBA・ポケモン

読書・ポケモン・NBA・統計学について書きます

五目並べ (paizaランク B 相当)をpython3で解答・解説

模範解答を確認すると、自分とはかなり違うコードが載っていたので、頭の整理も兼ねて自分の解答・解説を公開します。

考察

五目並べで決着が着くのはどんなときか?

五目並べで決着が着くパターンは大きく4通りに分けられます。すなわち、同じ記号が①横に5つ並ぶパターン、②縦に5つ並ぶパターン、③右上から左下へ斜めに5つ並ぶパターン、そして④左上から右下へ斜めに5つ並ぶパターンです。
 このうち③と④は、[横,縦]で石の配置を表すと、③については[0,0], [1,1], [2,2], [3,3], [4,4]に同じ記号が並ぶ場合のみ決着が着きます。また、④も[0,4], [1,3], [2,2], [3,1], [4,0]に同じ記号が並ぶ場合のみ決着が着きます。なので、if文を使ってこれらの位置の記号が同じかどうか調べるだけで、③と④で決着が着くかどうかがわかります。
 次にパターン①ですが、これで決着が着く記号の並び方は、同じく[横,縦]で表すと、たとえば[0,0], [0,1], [0,2], [0,3], [0,4]のように、横の数字iを固定した状態で、縦の数字が1~4とずらしていった位置に同じ記号が並んでいるときだとわかります。なので、2重にfor ループを回してあげればいいと考えました。
 最後にパターン②ですが、これで決着が着く記号の並び方は、同じく[横,縦]で表すと、たとえば[0,0], [1,0], [2,0], [3,0], [4,0]のように、縦の数字iを固定した状態で、横の数字が1~4とずらしていった位置に同じ記号が並んでいるときだとわかります。なので、これも2重にfor ループを回してあげればいいと思います。

解答

以上の考察を基に、書いたコードが次の通りです。

# coding: utf-8
# Your code here!

#勝負がついたかどうかを示すフラグを作る
match=False
#入力を二次元リストで受け取る
banmen=[]
for i in range(5):
    banmen.append(list(input()))
    
#左上から右下に5つ並んで勝つ場合
if banmen[0][0]==banmen[1][1]==banmen[2][2]==banmen[3][3]==banmen[4][4]:
    if banmen[0][0]==banmen[1][1]==banmen[2][2]==banmen[3][3]==banmen[4][4]==".":
        print("D")
        match=True
    else:
        print(str(banmen[0][0]))
    match=True
    
#右上から左下に5つ並んで勝つ場合
elif banmen[0][4]==banmen[1][3]==banmen[2][2]==banmen[3][1]==banmen[4][0]:
    if banmen[0][4]==banmen[1][3]==banmen[2][2]==banmen[3][1]==banmen[4][0]==".":
        print("D")
        match=True
    else:
        print(str(banmen[0][4]))
    match=True
    
else:
    #横に5つ並んで勝つ場合
    yoko5=[]    
    for yoko in range(5):
        for tate in range(5):
            yoko5.append(banmen[yoko][tate])
    
        if yoko5[0]==yoko5[1]==yoko5[2]==yoko5[3]==yoko5[4]:
            if yoko5[0]==yoko5[1]==yoko5[2]==yoko5[3]==yoko5[4]==".":
                print("D")
                match=True
            else:
                print(str(yoko5[0]))
                match=True
        yoko5=[]

    #縦に5つ並んで勝つ場合
    tate5=[]
    for tate in range(5):
        for yoko in range(5):
            tate5.append(banmen[yoko][tate])
        
        if tate5[0]==tate5[1]==tate5[2]==tate5[3]==tate5[4]:
            if tate5[0]==tate5[1]==tate5[2]==tate5[3]==tate5[4]==".":
                print("D")
                match=True
            else:
                print(str(tate5[0]))
                match=True
        tate5=[]
        
if match==False:
    print("D")