AtCoder の問題を Go で練習するためのテンプレートを作った

Jul 22, 2021 ( Feb 11, 2022 更新 )

最近 AtCoder の問題を解いているのですが、ブラウザでポチポチ入力してテストするのが面倒なので、手元でコードを書いてテストも一気にできるようにテンプレートを用意してみました。

mookjp/atcoder_practice: AtCoder practice repository

生成した例として 044 の B 問題 を入れておきました(解答は適当に書いているので参考にしないでください…)。

README に使い方は書いてありますが、こちらでも簡単に説明してみます。

過去コンテストごとの問題ディレクトリを生成する

リポジトリの中の init.sh を使ってテンプレートから問題ディレクトリを生成できます。

./init.sh {go module name} {directory name}

module 名は適当でいいです。私は過去コンテストごとにディレクトリを使っているので以下のような感じで実行します(ABC160 用のディレクトリを作る)。

./init.sh github.com/mookjp/atcoder 160

そうすると、以下のようにAからFまでの問題用のディレクトリが生成されます。

160
├── a
│   ├── go.mod
│   ├── main.go
│   ├── main_test.go
│   └── testfiles
│       └── 001
│           ├── stdin.txt
│           └── stdout.txt
├── b
│   ├── go.mod
│   ├── main.go
│   ├── main_test.go
│   └── testfiles
│       └── 001
│           ├── stdin.txt
│           └── stdout.txt

...

テストケースの追加

AtCoder でのテストケースの実行を、 main_test.gotestfiles/ 以下のファイルを使って簡単に手元で行えます。

stdin.txt には標準入力の例として書かれているテキストを、 stdout.txt には標準出力に出されるべき正解のテキストを書き込んでおきます。

testfiles/001/ と同様に、 testfiles/xxx/ のような stdin.txtstdout.txt を含むディレクトリを追加すればケースの追加が簡単にできます。

テストの実行

問題のディレクトリ以下で go test を実行します。

cd 044/b
go test -v
=== RUN   Test_main
=== RUN   Test_main/001
=== RUN   Test_main/002
--- PASS: Test_main (0.00s)
    --- PASS: Test_main/001 (0.00s)
    --- PASS: Test_main/002 (0.00s)
PASS
ok      github.com/mookjp/atcoder/044/b 0.100s

コードを書く

以下のように、 readerwriter を標準入力と標準出力として使ってください。

reader, writer 変数ではなく直接 os.Stdin 等を使った場合は main_test.go でのテスト実行ができなくなります。

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

var reader io.Reader
var writer io.Writer

func init() {
	reader = os.Stdin
	writer = os.Stdout
}

func main() {
	sc := bufio.NewScanner(reader)
    // Solve problem...
	fmt.Fprint(writer, "Answer")
}
Return to top