寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

paizaラーニング: C++による野球の審判とコール

野球の審判として適切なコールを出力する問題と、その提出コードの解答例です。
paizaラーニングのレベルアップ問題集「スキルチェック過去問題」からの出典です。
paiza.jp
・問題
 野球の各打者はストライクが 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 球目: ボール → "ball!"
 2 球目: ストライク → "strike!"
 3 球目: ボール → "ball!"
 4 球目: ボール → "ball!"
 5 球目: ストライク → "strike!"
 6 球目: ボール → "fourball!"
 6 球目では、ストライクが 2 つ、ボールが 4 つたまったのでこの打者はフォアボールとなります。

・入力される値:
 入力は、以下のフォーマットで与えられます。
   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つ入ります。
 入力値最終行の末尾に改行が1つ入ります。
 文字列は標準入力から渡されます。

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

・条件
 すべてのテストケースにおいて、以下の条件をみたします。
   3 ≦ N ≦ 6
 s_i (1 ≦ i ≦ N) は英字小文字で構成される文字列で、"strike", "ball" のいずれか。
 投球はこの打者の番がちょうど終了するまで続きます。
 すなわち、最終的にこの打者にはアウトかフォアボールのいずれかが必ず与えられ、それ以降の投球はおこなわれません。

僕が作成、提出したコードは、以下のとおりです。

/*
 C++による野球の審判とコール
 https://paiza.jp/works/mondai
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<iostream>
using namespace std;
int main(void){
    int n,b_num=0,s_num=0;
    string c,c_n;
    cin>>n;
    for(int i=0;i<n-1;i++){
        cin>>c;
        if(c=="ball"){
            printf("ball!\n");
            b_num+=1;
        }else if(c=="strike"){
            printf("strike!\n");
            s_num+=1;
        }
    }
    cin>>c_n;
    if(c_n=="ball"){
        b_num+=1;
    }else if(c_n=="strike"){
        s_num+=1;
    }
    if(b_num==4){
        printf("fourball!\n");
    }else if(s_num==3){
        printf("out!\n");
    }
    return 0;
}

paizaラーニングのレベルアップ問題集については、ユーザー同士で解答を教え合ったり、コードを公開したりするのは自由としています。
また授業や研修、教材などにも利用できるそうです。