LoginSignup
0
0

More than 5 years have passed since last update.

オフラインリアルタイムどう書くE23の実装例(Go)

Posted at

オフラインリアルタイムどう書く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ルーチンを使ったりすればもっと速いかもしれないけど、こんなところで。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0