Header
2020-03-14
2020-09-07

paiza(パイザ)Cランク練習問題|野球の審判のRubyサンプルコードと解説

2020 03 14 4291246f97f0f5fe7915bd047017dacd s

paiza(パイザ)Cランク相当の練習問題の解説とサンプルコードの|宝くじについてRubyサンプルコードと解説を記載します。

記載したサンプルコードは動作しましたが、Paizaに公式サンプルコードの記載はないので、他にも記載方法はあると思われます

問題の要件と概要は以下から

以下から公式の抜粋を元にプログラム化する際の思考の流れとサンプルコードを記載します

Cランク問題の野球の審判の入出力値

以下公式抜粋

問題概要

野球の各打者はストライクが 3 つたまるとアウトとなり、ボールが 4 つたまるとフォアボールとなります。
アウトあるいはフォアボールになると、この打者の番は終了します。

あなたはストライクとボールを判定してコールする審判です。
その場の状況に合わせて適切なコールを出しましょう。

【コール一覧】
ストライクが 1 〜 2 つたまったとき → "strike!"
ストライクが 3 つたまったとき → "out!"
ボールが 1 〜 3 つたまったとき → "ball!"
ボールが 4 つたまったとき → "fourball!"

ある打者の番における投球の結果 (ストライクまたはボール) が与えられるので、各投球に対してどのようなコールをすればよいかを出力してください。
なお、実際の野球にあっても上記にないルール (ヒット、ファウルなど) については考慮する必要はありません。


1 球目: ボール → "ball!"
2 球目: ストライク → "strike!"
3 球目: ボール → "ball!"
4 球目: ストライク → "strike!"
5 球目: ストライク → "out!"

5 球目では、ボールが 2 つ、ストライクが 3 つたまったのでこの打者はアウトとなります。
これは、入力例 1 に対応しています。


1 球目: ボール → "ball!"
2 球目: ストライク → "strike!"
3 球目: ボール → "ball!"
4 球目: ボール → "ball!"
5 球目: ストライク → "strike!"
6 球目: ボール → "fourball!"

6 球目では、ストライクが 2 つ、ボールが 4 つたまったのでこの打者はフォアボールとなります。
これは、入力例 2 に対応しています。
▼ 下記回答欄にコードを記入してみよう

入力値

入力は、以下のフォーマットで与えられます。

N
s_1
s_2
...
s_n

1 行目に合計の投球数を表す整数 N が与えられます。
続く N 行のうち i 行目 (1 ≦ i ≦ N) に i 番目の投球の結果を表す文字列 s_i が与えられます。i 番目の投球がストライクであれば s_i は "strike"、ボールであれば "ball" となります。
入力は合計で N + 1 行からなり、入力値最終行の末尾に改行が1つ入ります。

期待する出力

各投球に対する適切なコールを以下の形で出力してください。

c_1
c_2
...
c_N

期待する出力は N 行からなります。
N 行のうちの i 行目 (1 ≦ i ≦ N) に問題文の条件に即して打者へのコールを表す文字列 c_i を "strike!", "ball!", "out!", "fourball!" のいずれかで出力してください。
出力の N 行目の末尾に改行を 1 つ入れ、余計な文字、空行を含んではいけません。

入出力例(公式から抜粋)

入力例1
5
ball
strike
ball
strike
strike

出力例1
ball!
strike!
ball!
strike!
out!

入力例2
6
ball
strike
ball
ball
strike
ball

出力例2
ball!
strike!
ball!
ball!
strike!
fourbal

問題をプログラム化する際の考え方

入力値で以下のように記載されています。

5
ball
strike
ball
strike
strike

ここで分かる事は

1:数字を指定する

2:上記で入力した回数だけ処理を行うということが分かります。

次に出力例を見ると

出力例1

ball!
strike!
ball!
strike!
out!

出力例2
ball!
strike!
ball!
ball!
strike!
fourball!

1:出力時に入力値へ!を追加する必要があるという事が分かります。

2:また出力時は入力値に入力された文字列の最後の文字out!かfourballになります。

  具体的に言うと入力例1の最後に入力されたstrikeがoutになり、入力例2の最後に入力されたballがfourballに変換されます

3:strikeが3回入力されるとoutになり、それ以外はfourballと記載すれば良い

具体的に言うとstrikeが3回入力された時点でout!を出力する処理を記載して、それ以外はfourball!と出力する処理を記載すればよく プログラム化する際strike の件数をカウントする処理のみで、ballの件数をカウントする処理は必要ない

この部分は若干考慮漏れされる方が出るかもしれません

プログラム化する際にRuby的な処理を考える

1:カウントを取得

2:文字列を取得する空配列作成

3:strikeの件数を保存する変数を生成

以下カウント分処理を行う

4:配列に入力値を格納

5:strikeが入力されている場合は3の変数に追加

カウント分処理終了

6:2の配列の末尾の要素を削除する

7:2の配列分繰り返し処理を行う

8:出力値に!を追加

9:繰り返し処理の最後の場合に

  strikeが3つ入力されている場合はout!を出力

  それ以外はfourball!を出力

paizaCランク問題野球の審判のRubyサンプルコード

プログラム化する際に考えた事をRubyに当てはめます。

counts = gets.to_i
strings = []
num = 0

counts.times do
  string = gets.strip.chomp
  if string == "strike"
    num+= 1
  end
  strings << string
end


strings.pop

strings.each_with_index do |st, i|
  puts "#{st}!"
  if strings.count == i + 1
    if num == 3
      puts "out!"
    else
      puts "fourball!"
    end
  end
end

変数countsで繰り返し処理を行う回数を取得します。 次にstringsと言う空配列を作成します

次に繰り返し処理分入力値を配列に追加しますが、 strikeと言う文字列が入力されるとnum変数に1を追加します。

以下は自己代入の変数で、変数numへカウントアップされた数値を追加していきます。

  num+= 1

その後

popメソッドは配列の最後尾の要素を削除する破壊的メソッドです

関連記事

Ruby技術者認定試験 (Silver version 2.1)対策 | !が付かない破壊的メソッド

あとはeachwithindexで配列の要素と処理回数によって 出力する処理を変更していきます

strings.each_with_index do |st, i|
  puts "#{st}!"
  if strings.count == i + 1
    if num == 3
      puts "out!"
    else
      puts "fourball!"
    end
  end
end

初心者・独学者向け|Rubyの配列処理の入門とよく使うメソッド

Rubyの練習問題:配列編|初心者・独学者向け入門コンテンツ

ちなみにHashでstrikeの数を取得する際は以下のような形で利用可能

counts = gets.to_i
strings = []

counts.times do
  string = gets.strip.chomp
  strings << string
end

result_hash = strings.group_by(&:itself).map{ |k, v| [k, v.count] }.to_h
strikes = result_hash["strike"]

strings.pop

strings.each_with_index do |st, i|
  puts "#{st}!"
  if strings.count == i + 1
    if strikes.to_i == 3
      puts "out!"
    else
      puts "fourball!"
    end
  end
end

関連問題

paizaのスキルチェックの難易度|各ランクの特徴・ランクアップのコツを現役エンジニアが解説

paiza(パイザ)Bランク練習問題|日別訪問者数の最大平均区間のRubyサンプルコードと解説

paiza(パイザ)Bランク練習問題|神経衰弱のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|5以上の整数の合計のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|検索履歴のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|宝くじのRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|アルファベット探しのRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|単語のカウントのRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|野球の審判のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|【競技7】奇数大好き山田さんのRubyサンプルコードと解説

Rubyで以下のような練習問題を用意しているので、回答できなかった方はまずは以下練習問題を試してみてください

Rubyの練習問題:配列編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:文字列編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:ハッシュ編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:繰り返し処理編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:ファイル操作編|初心者・独学者向け入門コンテンツ

Rubyでバブルソートを行う

Rubyで二分探索(バイナリサーチ)を行う

paiza(パイザ)に慣れるとAtCoderアットコーダーもお勧めです

その他関連記事

未経験からエンジニアに転職した人間が考える、今からエンジニアに就職する方法

エンジニア転職で年収が上がりやすい経験業務

エンジニア転職で年収を上げるには?

プログラミングポートフォリオとは|未経験からエンジニアに就職した人間が解説

職歴を作るためにSESに就職して、Web系エンジニアへ転職は可能か

業務SESやSIからWeb系エンジニア転職の志望企業の見つけ方

独学プログラミングの勉強手順|未経験からエンジニアに転職した人間が解説

あなたにお勧めの記事
前の記事
次の記事