第159回【Python】五目並べ(1行)、五目並べ(横)、五目並べ(縦)

現在取り組んでいるのは、paiza ラーニング問題集「B ランクレベルアップメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 159 回目です。

週の始まりに、まずは週末の天気を確認します。そして、キャンプに行くかどうか、行くならどこへ行くかを話し合います。キャンプに行かない日でも、代わりに何をするか、どこへ行くかを話し合います。突然天気予報が変わってしまったときは、大変悲しいです。

それでは、今日も頑張ってみようと思います。

今回取り組む内容について

以下は、前回までに取り組んだ問題とまったく同じなので、飛ばします。
コードは数書いてナンボとかカッコつけたこと書いてましたが、あまりにも多いので挫折しました。

STEP: 1 文字列の出力

五目並べ(1行) (paizaランク D 相当)

1行5列の五目並べの盤面が与えられます。

盤面の各マスには、"O"か"X"か"."が書かれています。

“O"と"X"は、それぞれプレイヤーの記号を表します。

同じ記号が横に連続で5つ並んでいれば、その記号のプレイヤーが勝者となります。

勝者の記号を1行で表示してください。
勝者がいない場合は、引き分けとして、"D"を表示してください。

s

期待する出力

勝者の記号を1行で表示してください。
勝者がいない場合は、引き分けとして、"D"を表示してください。


すべてのテストケースにおいて、以下の条件をみたします。

・sの文字数は5文字
・sに含まれる文字は"O"か"X"か"."のいずれか
・勝者が2人になる盤面が、与えられることはありません。


入力例

OOOOO

出力例

O

交互に打つのだろうか。だとしたら、永遠に勝者が誕生しないゲームだと思う。

Python
s = input()

if s == 'OOOOO':
    print('O')
elif s == 'XXXXX':
    print('X')
else:
    print('D')
VBA
Sub tic_tac_toe_1()

    s = Cells(1, 1)
    
    If s = "OOOOO" Then
        Debug.Print "O"
    ElseIf s = "XXXXX" Then
        Debug.Print "X"
    Else
        Debug.Print "D"
    End If
    
End Sub

五目並べ(横) (paizaランク C 相当)

5行5列の五目並べの盤面が与えられます。

盤面の各マスには、"O"か"X"か"."が書かれています。

“O"と"X"は、それぞれプレイヤーの記号を表します。

同じ記号が横に連続で5つ並んでいれば、その記号のプレイヤーが勝者となります。

勝者の記号を1行で表示してください。
勝者がいない場合は、引き分けとして、"D"を表示してください。

s_1
s_2
s_3
s_4
s_5

期待する出力

勝者の記号を1行で表示してください。
勝者がいない場合は、引き分けとして、"D"を表示してください。


すべてのテストケースにおいて、以下の条件をみたします。

・s_iの文字数は5文字
・s_iに含まれる文字は"O"か"X"か"."のいずれか
・勝者が2人になる盤面が、与えられることはありません。


入力例

XXOXO
OXOXX
OOOOO
OXOX.
XOXXO

出力例

O

5 行検査すればいいだけ? それなら前問とあまり変わらない。

Python
s = [input() for _ in range(5)]

for i in range(5):
    if s[i] == 'OOOOO':
        print('O')
        break
    elif s[i] == 'XXXXX':
        print('X')
        break
else:
    print('D')
VBA
Sub tic_tac_toe_2()

    Dim s(4)
    
    For i = 0 To 4
        s(i) = Cells(i + 1, 1)
    Next
    
    Do
        For i = 0 To 4
        
            If s(i) = "OOOOO" Then
                Debug.Print "O"
                Exit Do
            ElseIf s(i) = "XXXXX" Then
                Debug.Print "X"
                Exit Do
            End If
        Next
        
        Debug.Print "D"
        
    Loop While False
        
End Sub

五目並べ(縦) (paizaランク C 相当)

5行5列の五目並べの盤面が与えられます。

盤面の各マスには、"O"か"X"か"."が書かれています。

“O"と"X"は、それぞれプレイヤーの記号を表します。

同じ記号が縦に連続で5つ並んでいれば、その記号のプレイヤーが勝者となります。

勝者の記号を1行で表示してください。
勝者がいない場合は、引き分けとして、"D"を表示してください。

s_1
s_2
s_3
s_4
s_5

期待する出力

勝者の記号を1行で表示してください。
勝者がいない場合は、引き分けとして、"D"を表示してください。


すべてのテストケースにおいて、以下の条件をみたします。

・s_iの文字数は5文字
・s_iに含まれる文字は"O"か"X"か"."のいずれか
・勝者が2人になる盤面が、与えられることはありません。


入力例

XXOXO
OXOXX
OOOOO
OXOX.
XOXXO

出力例

D

急に難易度変わる。numpy で、とか考えてはダメ。たぶん。

Python
s = [input() for _ in range(5)]

res = 'D'
stone = s[0][0]

for i in range(5):
    stone = s[0][i]
    cnt = 1
    
    for j in range(1,5):
        if stone != '.' and stone == s[j][i]:
            cnt += 1
            
    if cnt == 5:
        res = stone
        break
    
print(res)
VBA
Sub tic_tac_toe_3()

    Dim s(4)
    res = "D"
    
    For i = 0 To 4
        s(i) = Cells(i + 1, 1)
    Next
    
    For i = 0 To 4
        stone = Mid(s(0), i + 1, 1)
        cnt = 1
        
        For j = 1 To 4
            If stone <> "." And stone = Mid(s(j), i + 1, 1) Then
                cnt = cnt + 1
            End If
        Next
        
        If cnt = 5 Then
            res = stone
            Exit For
        End If
    Next
        
    Debug.Print res
    
End Sub

最後に

Python では、なんだかんだわかりやすく書けたと思うけれど、VBA になると、結構難解。手数は増えても、もう少しわかりやすい書き方を探った方が良かったかもしれないと反省。

配列を縦方向に検査するのは、なんか気持ち悪さが残ります。苦手です。しかし、実際は使われることが多いので、身につくまでしっかり自分自身で書いて練習しようと思いました。

引き続き、よろしくお願いいたします!

PythonPython,paiza,学習

Posted by LeoSaki