最近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
}
また何かあれば追加していきます。