Решение на Poor Man's Currying от Александра Драголова

Обратно към всички решения

Към профила на Александра Драголова

Резултати

  • 7 точки от тестове
  • 0 бонус точки
  • 7 точки общо
  • 4 успешни тест(а)
  • 2 неуспешни тест(а)

Код

package main
import "fmt"
func Generator(gen func(int) int, initial int) func() int {
i := initial
return func() (ret int) {
ret = i
i = gen(i)
return
}
}
func Repeater(s, sep string) func(int) string {
cat := s + sep
return func(cnt int) string {
var rep_res string
for i := 0; i < cnt; i++ {
if i+1 < cnt {
rep_res += cat
} else {
rep_res += s
}
}
return rep_res
}
}
func MapReducer(mapper func(int) int, reducer func(int, int) int, initial int) func(...int) int {
return func(elements ...int) (res int) {
res = initial
for i := 0; i < len(elements); i++ {
elements[i] = mapper(elements[i])
res = reducer(elements[i], res)
}
return res
}
}
func main() {

Няма нужда добавяш main функция в решението си. Ако искаш да тестваш с такава, може да си я сложиш в съседен файл и да пускаш всичко с go run ..

fmt.Println("Repeater:")
fmt.Println(Repeater("foo", ":")(3)) // foo:foo:foo
fmt.Println("Generator:")
counter := Generator(
func(v int) int { return v + 1 },
0,
)
power := Generator(
func(v int) int { return v * v },
2,
)
fmt.Println(counter()) // 0
fmt.Println(counter()) // 1
fmt.Println(power()) // 2
fmt.Println(power()) // 4
fmt.Println(counter()) // 2
fmt.Println(power()) // 16
fmt.Println(counter()) // 3
fmt.Println(power()) // 256
fmt.Println("MapReducer:")
powerSum := MapReducer(
func(v int) int { return v * v },
func(a, v int) int { return a + v },
0,
)
fmt.Println(powerSum(1, 2, 3, 4)) // 30
}

Лог от изпълнението

PASS
ok  	_/tmp/d20181024-53-1p637cz	0.002s
PASS
ok  	_/tmp/d20181024-53-1p637cz	0.002s
PASS
ok  	_/tmp/d20181024-53-1p637cz	0.002s
PASS
ok  	_/tmp/d20181024-53-1p637cz	0.002s
--- FAIL: TestMapReducer (0.00s)
    --- FAIL: TestMapReducer/left_shift_all_the_way (0.00s)
        solution_test.go:291: Expected 88080384 but got 0
    --- FAIL: TestMapReducer/left_foldedness (0.00s)
        solution_test.go:291: Expected 64 but got 0
FAIL
exit status 1
FAIL	_/tmp/d20181024-53-1p637cz	0.002s
--- FAIL: TestMapReducerMultipleCalls (0.00s)
    solution_test.go:318: Expected 45 but got 22 after 2nd call
FAIL
exit status 1
FAIL	_/tmp/d20181024-53-1p637cz	0.002s

История (1 версия и 2 коментара)

Александра обнови решението на 24.10.2018 11:50 (преди 10 месеца)

+package main
+
+import "fmt"
+
+func Generator(gen func(int) int, initial int) func() int {
+ i := initial
+ return func() (ret int) {
+ ret = i
+ i = gen(i)
+ return
+ }
+}
+
+func Repeater(s, sep string) func(int) string {
+ cat := s + sep
+ return func(cnt int) string {
+ var rep_res string
+ for i := 0; i < cnt; i++ {
+ if i+1 < cnt {
+ rep_res += cat
+ } else {
+ rep_res += s
+ }
+ }
+ return rep_res
+ }
+}
+
+func MapReducer(mapper func(int) int, reducer func(int, int) int, initial int) func(...int) int {
+ return func(elements ...int) (res int) {
+ res = initial
+ for i := 0; i < len(elements); i++ {
+ elements[i] = mapper(elements[i])
+ res = reducer(elements[i], res)
+ }
+ return res
+ }
+}
+func main() {

Няма нужда добавяш main функция в решението си. Ако искаш да тестваш с такава, може да си я сложиш в съседен файл и да пускаш всичко с go run ..

+ fmt.Println("Repeater:")
+ fmt.Println(Repeater("foo", ":")(3)) // foo:foo:foo
+
+ fmt.Println("Generator:")
+ counter := Generator(
+ func(v int) int { return v + 1 },
+ 0,
+ )
+ power := Generator(
+ func(v int) int { return v * v },
+ 2,
+ )
+ fmt.Println(counter()) // 0
+ fmt.Println(counter()) // 1
+ fmt.Println(power()) // 2
+ fmt.Println(power()) // 4
+ fmt.Println(counter()) // 2
+ fmt.Println(power()) // 16
+ fmt.Println(counter()) // 3
+ fmt.Println(power()) // 256
+
+ fmt.Println("MapReducer:")
+ powerSum := MapReducer(
+ func(v int) int { return v * v },
+ func(a, v int) int { return a + v },
+ 0,
+ )
+
+ fmt.Println(powerSum(1, 2, 3, 4)) // 30
+}

Помисли дали си направила всичко, което условието ти казва. Има ли неща, които само си се надявала да спазиш и все пак не си проверила изрично?