競プロ golang 複数行文字列を配列で返してテストで使う

複数行文字列をリストにしたい

パッケージ化しました

github.com

インストール
go get github.com/ergofriend/ml2array
使い方
input := `4 5 2
0 1 2 1
0 2 1 2
1 2 1 1
1 3 1 3
2 3 2 1`

result := ml2array.Make(input)

for i := 0; i < len(result); i++ {
    fmt.Printf("%d行目:%s\n", i, result[i])
}

やっていく

現在のテストコード

現在のテストコードは1行ずつリストで足していくやり方です。

func getTests() []testValue {
    testValues := []testValue{
        testValue{
            []string{
                "3 6",
                "3 4 5",
            },
            "2"},
    }
    return testValues
}

しかし、競プロなどで例として載っけられているテストケースは複数行のテキストです。

↓こんな感じ

Image from Gyazo

これを一回でコピペしてテスト出来るようししていきます。

複数行文字列

goでは、こんな風に書きます。

input := `4 5 2
0 1 2 1
0 2 1 2
1 2 1 1
1 3 1 3
2 3 2 1`

まずappend等での速度低下をなくすために、行数を数えて必要な大きさのスライスを作成します。

var lineCount int
for i := range input {
    if input[i] == 10 {
        lineCount++
    }
}
resultArray := make([]string, lineCount)

最後に、各行をスライスに代入します。

var i int

scanner := bufio.NewScanner(strings.NewReader(mlstring))
for scanner.Scan() {
    resultArray[i] = scanner.Text()
    i++
}

終わりのテストコード

関数化して使いやすくします。

func getTests() []testValue {
    testValues := []testValue{
        testValue{
            ml2array.Make(`4 5 2
0 1 2 1
0 2 1 2
1 2 1 1
1 3 1 3
2 3 2 1`),
            "2"},
    return testValues
}

完成!