No.656 ゴルフ

はじめに

競技プログラミングyukicoder
No.656 ゴルフ
言語はC#
何かあればTwitter→@pirorirori_n712まで

問題

入力:ゴルフの9ホールぶんのスコア、文字列S
出力:スコアの合計値

解き方

入力された数字をすべて足す、ただし入力が0だった場合は値を10として扱う。

①foreachで一つずつ値を取り出して足していく

②Linqを使う(int型に変換)

③Linqを使う(ASCIIを使う)

①foreachで一つずつ値を取り出して足していく

foreachを使って、入力された文字列から文字を一つずつ取り出し、足していきます。

コード例

using System;

class No656{
    static void Main(string[] args){
        //入力を読み込む
        string str=Console.ReadLine();
        //値を足していくための変数を準備
        var add=0;
        //foreachで値を一つずつとりだす
        foreach(char c in str){
            //char型をstring型に直してからint型に変換
            //(int)charでintにcharをキャストするとANCIIでの10進数になる
            //のでstringに直してからintにキャストする
            var score=Int32.Parse(c.ToString());
            //入力が0でなければ変数に値を足す
            if(score!=0) add+=score;
            //入力が0であれば変数に10を足す
            else add+=10;
        }
        //変数を最後に出力
        Console.WriteLine(add);
    }
}

ASCIIについては③Linqを使う(ASCIIを使う)で少し触れます。

LINQを使う(int型に変換)

LINQを使って、さっぱりと足していきます。

コード例

using System;
using System.Linq;

class No656{
    static void Main(){
        //入力をint型に変換して全ての和を求める
        Console.WriteLine(Console.ReadLine()        //出力する //入力
            .Select(x=>Int32.Parse(x.ToString()))   //入力をstring型に変換してからint型に変換(char型で一文字ずつ取り出すことになる)
            .Sum(x=>x<1?10:x));                     //x<1つまりx==0のときは値を10としてすべての和を求める
    }
}

LINQを使う(ASCIIを使う)

ASCIIコードを使います

char型について
①10進としても文字としても扱うことが可能

(char)'0'は(int)48であり(char)'0'なので
(char)'0'==(int)48、(char)'0'==(char)'0'がどちらも成り立ちます(true)
また
10進=(int)文字
文字=(char)10進
で10進と文字を行き来することもできます

②文字をそのまま数字に直す((char)'0'→(int)0)

文字を引き算すれば数字に直すことができます
(char-char)
(char)'9'-(char)'0'=(int)9
以下のように、文字から数字をひいても数字に直せます
(char-10進)
(char)'9'-48=(int)9
48は'0'です

コード例

using System;
using System.Linq;

class No656{
    static void Main(){
        Console.WriteLine(Console.ReadLine()
            .Sum(x=>x==48?10:x-48));    //xが'0'なら10、その他ならintにキャストして和を計算
                                        //.Sum(x=>x=='0'?10:x-'0')などでも可能
    }
}