第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 になると、結構難解。手数は増えても、もう少しわかりやすい書き方を探った方が良かったかもしれないと反省。
配列を縦方向に検査するのは、なんか気持ち悪さが残ります。苦手です。しかし、実際は使われることが多いので、身につくまでしっかり自分自身で書いて練習しようと思いました。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません