プログラミング学習

Rubyやrailsについて学んだことをアウトプットしています。

【Paiza】Bランクレベルアップメニュー

今回はpaizaのBランクレベルアップメニューの「五目並べ(横) (paizaランク C 相当)」を解いていきます。

問題文

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

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

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

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

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

入力例1 XXOXO OXOXX OOOOO OXOX. XOXXO

出力例1 O

回答方法

最初にこの問題で出力しなければならない要素からコードを考えていきます。

・結果を変数に代入する。

result = "D" # デフォルトでは引き分けに設定し、結果に応じてこの中身が変化するようにする。

・プレイヤーの記号を配列に代入する。

array = [X, O] 

・プレイヤーごとに5つ連続で横に目がそろうかを確認する。

(1..5).each do # 5回入力が行われるのでそれぞれの行で以下の検証を行う。
  string = gets.chomp.split('')
# 5行に渡って入力される値を空白で分けて配列として受け取っている。
  array.each do |a|
    cnt = 0
    # arrayのeachメソッド内でcunは定義されているのでOとXでそれぞれcntの中身は変わる
    string.each { |s| cnt = cnt + 1 if s == a }
    # 二重で繰り返し処理が行われている。string配列を1行ずつ取り出す。
    # さらに一文字ずつ取り出してarrayのaと一致するかを確認。一致した場合はカウントを1増やす。
    result = a if cnt >= 5
  end
end

・結果を出力する。

puts result 

これで指定された出力を行うことができました。