オフラインリアルタイムどう書くE23の実装例
問題 : http://nabetani.sakura.ne.jp/hena/orde23nokoch/
イベント : https://yhpg.doorkeeper.jp/events/71800
実装リンク集 : https://qiita.com/Nabetani/items/77e7e2c749767f197c0e
で。
腕力版を go で書いてみた。
実装
package koch
import (
"strconv"
"strings"
)
func solve(s string) string {
separated := strings.Split(s, ",")
pos, _ := strconv.Atoi(separated[0])
pos--
commands := separated[1]
curve := []int{0}
for _, cmd := range commands {
c := make([]int, 0, len(curve)*5)
for _, e := range curve {
if cmd == 'a' {
c = append(c, e+0, e+1, e+2, e+0)
} else {
c = append(c, e+0, e+1, e+0, e+2, e+0)
}
}
curve = c
}
if len(curve) <= pos {
return "x"
}
return [3]string{"0", "+", "-"}[curve[pos]%3]
}
test
package koch
import (
"testing"
)
func TestKoch(t *testing.T) {
var tests = []struct {
name string
input string
want string
}{
{"0", "120,aabb", "0"},
{"1", "100,a", "x"},
{"2", "3,a", "-"},
// 中略
{"66", "36831104,babbbbbbabab", "+"},
}
for _, test := range tests {
got := solve(test.input)
if got != test.want {
t.Errorf("%v: solve(%q)=%q, want %q\n", test.name, test.input, got, test.want)
}
}
}
手元のマシンで 2秒ちょっと。速いね。
goルーチンを使ったりすればもっと速いかもしれないけど、こんなところで。