Help us understand the problem. What is going on with this article?

GolangでAtCoderの問題を解くためのスニペット集

More than 1 year has passed since last update.

最近Goの練習も兼ねてAtCoderのコンテストに参加していたりするのですが、毎回同じようなことを書いているなーと感じたのでまとめておきます。
普通に考えたらパッケージ化しろという話なんですが、競プロでは単一のソースファイルにする必要があるため古き良きスニペットという形で用意しておきます。
AtCoderと書きましたが他の競技プログラミングサイトでもおそらく使えると思います。

以下importは省略してます。

入出力系

単一の数値入力

var N int
fmt.Scan(&N)

単一の文字列入力

var s string
fmt.Scan(&s)

指定の要素数の数列を読み込んでスライスで返す関数

func scanNums(len int) (nums []int) {
    var num int
    for i := 0; i < len; i++ {
        fmt.Scan(&num)
        nums = append(nums, num)
    }
    return
}

指定の要素数の文字列群を読み込んでスライスで返す関数

func scanStrings(len int) (strings []string) {
    var str string
    for i := 0; i < len; i++ {
        fmt.Scanf("%s", &str)
        strings = append(strings, str)
    }
    return
}

出力はだいたいこれで

fmt.Println(result)

計算系

競プロでは整数の計算をよくするんですが、Go標準のmathパッケージはfloat64でしか計算してくれないんですよね。なので、毎回書くのも面倒なので、各関数をintで使えるようにラップしておきます。

func abs(a int) int {
    return int(math.Abs(float64(a)))
}

func pow(p, q int) int {
    return int(math.Pow(float64(p), float64(q)))
}

minとmaxはちょっと拡張して任意の要素数を渡せるようにしています。

func min(nums ...int) int {
    if len(nums) == 0 {
        panic("funciton min() requires at least one argument.")
    }
    res := nums[0]
    for i := 0; i < len(nums); i++ {
        res = int(math.Min(float64(res), float64(nums[i])))
    }
    return res
}

func max(nums ...int) int {
    if len(nums) == 0 {
        panic("funciton max() requires at least one argument.")
    }
    res := nums[0]
    for i := 0; i < len(nums); i++ {
        res = int(math.Max(float64(res), float64(nums[i])))
    }
    return res
}

わざわざfloat64にキャストしてパッケージに投げるよりこのくらいの計算自分で実装したほうがメモリも食わんし速く実行できるみたいな考え方もあるのですが、車輪の再発明をするのもなー、という気持ちがあって今回はこのようにしています。(どうにかならないんですかね、これ)

文字列系

文字列群aの中に文字列bが含まれるかどうかを判定する。

func strSearch(a []string, b string) bool {
    for i := 0; i < len(a); i++ {
        if a[i] == b {
            return true
        }
    }
    return false
}

また何かあれば追加していきます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした