BETA

[Go] AtCoderで標準入力するためのスニペット

投稿日:2020-03-24
最終更新:2020-03-24

初めに

業務でスクリプト言語ぱかり書いていたことに焦り、コンパイル言語を学びなおそうとしたところ、C/C++とRustが社内プロキシのせいで環境構築できなかったのでGo言語を学ぶなどする。

ということでAtCoderを解くときに気になる標準入力のパターンの一部を作った。

参考記事

以下の記事を参考に(というか一部そのままパク...お借り)した。

Goで標準入力から文字列や数値列を取得する - Qiita

目次

  • ソースコード
  • Case 01: 1行の文字列を入力
  • Case 02: 1つの符号付き整数値(64bit)を入力
  • Case 03: 1つの符号なし整数値(64bit)を入力
  • Case 04: 1つの符号付き浮動小数点数の入力
  • Case 05: 空白区切りで複数の文字列を1行で入力
  • Case 06: 空白区切りで複数の符号付き整数値(64bit)を1行で入力
  • Case 07: 空白区切りで複数の符号付き浮動小数点数(64bit)を1行で入力
  • Case 08: 1つの整数を入力させて、その回数だけさらに入力を繰り返す
  • Case 09: 1つの整数を入力させて、その回数だけさらに複数の整数値の入力を繰り返す

ソースコード

package atcoder  

import (  
    "bufio"  
    "os"  
    "strconv"  
    "strings"  
)  

// 1行の文字列を入力  
// Example:  
// -----------------  
// hogehoge  
// -----------------  
func StrStdin() string {  
    scanner := bufio.NewScanner(os.Stdin)  
    scanner.Scan()  
    return strings.TrimSpace(scanner.Text())  
}  

// 1つの符号付き整数値(64bit)入力  
// Exapmle:  
// ------------------  
// 1000000007  
// ------------------  
func Int64Stdin() int64 {  
    stringInput := StrStdin()  
    num, _ := strconv.ParseInt(strings.TrimSpace(stringInput), 10, 64)  
    return num  
}  

// 1つの符号なし整数値(64bit)入力  
// Exapmle:  
// ------------------  
// 1000000007  
// ------------------  
func Uint64Stdin() uint64 {  
    stringInput := StrStdin()  
    num, _ := strconv.ParseUint(strings.TrimSpace(stringInput), 10, 64)  
    return num  
}  

// 1つの符号付き浮動小数点数(64bit)の入力  
// Exapmle:  
// ------------------  
// 33.4  
// ------------------  
func Float64Stdin() float64 {  
    stringInput := StrStdin()  
    num, _ := strconv.ParseFloat(strings.TrimSpace(stringInput), 64)  
    return num  
}  

// 空白や空文字だけの値を除去したSplit  
func SplitWithoutEmpty(stringTargeted string, delim string) []string {  
    stringSplited := strings.Split(stringTargeted, delim)  
    strs := []string{}  

    for _, str := range stringSplited {  
        if str != "" {  
            strs = append(strs, str)  
        }  
    }  
    return strs  
}  

// 空白区切りで複数の文字列を1行で入力  
// Example:  
// --------------------  
// hoge fuga hage  
// --------------------  
func SliceStrsStdin(delim string) []string {  
    stringInput := StrStdin()  
    return SplitWithoutEmpty(stringInput, delim)  
}  

// 空白区切りで複数の符号付き整数値(64bit)を1行で入力  
// Example:  
// --------------------  
// 45 -100 23  
// --------------------  
func SliceInt64Stdin() []int64 {  
    stringSplited := SliceStrsStdin(" ")  

    int64Slice := []int64{}  

    for ni := range stringSplited {  
        num, _ := strconv.ParseInt(stringSplited[ni], 10, 64)  
        int64Slice = append(int64Slice, num)  
    }  

    return int64Slice  
}  

// 空白区切りで複数の符号なし整数値(64bit)を1行で入力  
// Example:  
// --------------------  
// 43 7 21  
// --------------------  
func SliceUint64Stdin() []uint64 {  
    stringSplited := SliceStrsStdin(" ")  

    uint64Slice := []uint64{}  

    for ni := range stringSplited {  
        num, _ := strconv.ParseUint(stringSplited[ni], 10, 64)  
        uint64Slice = append(uint64Slice, num)  
    }  

    return uint64Slice  
}  

// 空白区切りで複数の符号付き浮動小数点数(64bit)を入力  
// Example:  
// --------------------  
// 45.0 -62.1 11.7  
// --------------------  
func SliceFloat64Stdin() []float64 {  
    stringSplited := SliceStrsStdin(" ")  

    float64Slice := []float64{}  

    for ni := range stringSplited {  
        num, _ := strconv.ParseFloat(stringSplited[ni], 64)  
        float64Slice = append(float64Slice, num)  
    }  

    return float64Slice  
}  

Case 01: 1行の文字列を入力

// Example:  
// -----------  
// hogehoge  
// -----------  
message := atcoder.StrStdin()  

Case 02: 1つの符号付き整数値(64bit)を入力

// Example:   
// --------------  
// 1000000007  
// --------------  
num_int64 := atcoder.Int64Stdin()  

Case 03: 1つの符号なし整数値(64bit)を入力

// Example:  
// --------------  
// 202021  
// --------------  
num_uint64 := atcoder.Uint64Stdin()  

Case 04: 1つの符号付き浮動小数点数の入力

// Example:  
// ------------  
// 45.2  
// ------------  
num_float64 := atcoder.Float64Stdin()  

Case 05: 空白区切りで複数の文字列を1行で入力

// Example:  
// -----------------  
// hoge fuga hage  
// -----------------  
messages := atcoder.SliceStrStdin()  

// [hoge fuga hage]  
fmt.Println(messages)  

Case 06: 空白区切りで複数の符号付き整数値(64bit)を1行で入力

// 空白区切りで複数の符号付き整数値(64bit)を入力    
// Example:    
// --------------------    
// 45 -100 23    
// --------------------  
nums := atcoder.SliceInt64Stdin()  

// [45 -100 23]  
fmt.Println(nums)  

Case 07: 空白区切りで複数の符号付き浮動小数点数(64bit)を1行で入力

// 空白区切りで複数の符号付き浮動小数点(64bit)を入力    
// Example:    
// --------------------    
// 45.0 -62.1 11.7    
// --------------------   
float64_nums := atcoder.SliceFloat64Stdin()  

// [45.0 -62.1 11.7]  
fmt.Println(float64_nums)  

Case 08: 1つの整数を入力させて、その回数だけさらに1つの整数値の入力を繰り返す

// Example:  
// 3  
// 2  
// 0  
// -1  
s := []int64{}  
n := atcoder.Int64Stdin()  
for ni := 0; ni < n; ni++ {  
    s = append(s, atcoder.Int64Stdin())    
}  
fmt.Println(s) // [2 0 -1]  

Case 09: 1つの整数を入力させて、その回数だけさらに複数の整数値の入力を繰り返す

// Example:  
// --------------------  
// 5  
// 1 9  
// 2 3  
// 4 -1  
// 5 8  
// 7 0  
// ---------------------  

s, t := []int64{}, []int64{}  
n := atcoder.Int64Stdin()  
for ni := 0; ni < n; ni++ {  
    st := atcoder.SliceInt64Stdin()   
    s, t = append(s, st[0]), append(t, st[1])  
}  

fmt.Println(s) // [1 2 4 5 7]  
fmt.Println(t) // [9 3 -1 8 0]  

終わりに

握りつぶしちゃってるエラー処理については後日検討します

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

しばらくはReact (+ TypeScript)、C++、Pythonの学習記録をメインにしていこうと思います。 GitHub→https://github.com/koralle

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう