問題 : http://nabetani.sakura.ne.jp/hena/ordf10updown/
実装リンク集 : https://qiita.com/Nabetani/items/dae474bc17827f9b1537
で。
https://qiita.com/Nabetani/items/1e673478d99e5dbfc1be にある実装のうちのひとつ(ruby の方 ) を、go で書いてみた。
実装
package f10
import (
"fmt"
"strconv"
)
func numAt(f map[string]int, x int, y int) string {
val, ok := f[fmt.Sprintf("%d,%d", x, y)]
if !ok {
return "-"
}
return strconv.Itoa(val)
}
func solve(src string) string {
num, _ := strconv.Atoi(src)
f := map[string]int{}
phase := 0
x := 0
y := 0
var numx int
var numy int
upperbound := num*2 + 100 // 根拠のない計算
for i := 1; i < upperbound; i++ {
f[fmt.Sprintf("%d,%d", x, y)] = i
if i == num {
numx, numy = x, y
}
switch phase {
case 0:
y++
phase = 1
case 1:
x++
if x == y {
phase = 2
}
case 2:
y--
if y == 0 {
phase = 3
}
case 3:
x++
phase = 4
case 4:
y++
if x == y {
phase = 5
}
case 5:
x--
if x == 0 {
phase = 0
}
}
}
v0 := numAt(f, numx, numy-1)
v1 := numAt(f, numx, numy+1)
v2 := numAt(f, numx-1, numy)
v3 := numAt(f, numx+1, numy)
return fmt.Sprintf("%s,%s,%s,%s", v0, v1, v2, v3)
}
test
package f10
import (
"testing"
)
func TestKoch(t *testing.T) {
var tests = []struct {
name string
input string
want string
}{
{"0", "10", "9,25,-,11"},
{"1", "1", "-,2,-,4"},
{"2", "2", "1,9,-,3"},
// 中略
{"35", "6772", "6771,6773,6677,7009"},
}
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)
}
}
}
別に難しいことはなくて、順当な感じ。
後置if がほしいなぁとか、そういう気分。
v0〜v3 への代入をもう少しなんとかしたいところだけど、goならこんな感じかなとも思ったりする。