最近 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.go
と testfiles/
以下のファイルを使って簡単に手元で行えます。
stdin.txt
には標準入力の例として書かれているテキストを、 stdout.txt
には標準出力に出されるべき正解のテキストを書き込んでおきます。
testfiles/001/
と同様に、 testfiles/xxx/
のような stdin.txt
と stdout.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
コードを書く
以下のように、 reader
と writer
を標準入力と標準出力として使ってください。
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")
}