Дойчин обнови решението на 17.10.2014 21:01 (преди над 3 години)
+package main
+
+func Map(data []string, mapper func(string) string) []string {
+ result := make([]string, len(data), len(data))
+ for ind, val := range data {
+ result[ind] = mapper(val)
+ }
+ return result
+}
+
+func Filter(data []string, predicate func(string) bool) []string {
+ result := make([]string, 0, len(data))
+ for _, val := range data {
+ if !predicate(val) {
+ continue
+ }
+ result = append(result, val)
+ }
+ return result
+}
+
+func Reduce(data []string, combinator func(string, string) string) string {
+ result := ""
+ for _, val := range data {
+ result = combinator(result, val)
+ }
+ return result
+}
+
+func Any(data []string, predicate func(string) bool) bool {
+ for _, val := range data {
+ if predicate(val) {
+ return true
+ }
+ }
+ return false
+}
+
+func All(data []string, predicate func(string) bool) bool {
+ for _, val := range data {
+ if !predicate(val) {
+ return false
+ }
+ }
+ return true
+}
-
Reduce
-а ти не работи вслучай наlen(data) > 0
:) - прочети условието. -
добре де ако
Filter
му бъде подадено нещо в стилlen(data) == 1000
иfunc(string) bool { return false; }
не смяташ ли че ще върнеш един слайс с един много голям масив отдолу за който не е сигурно че някога ще го използваш?
Бооже, май съм зле :D
- Reduce: Но все още не мога да разбера къде греша. А не си спомням твоите тестове и не искам да го гледам преди да се сетя сам. Даже си написах тест специално за това преди да го предада:
func TestReduceEdges(t *testing.T) {
input := []string{}
output := ""
result := Reduce(input, concat)
if result != output {
t.Errorf("expected [%s] got [%s]", output, result)
}
input = []string{"one"}
output = "one"
result = Reduce(input, concat)
if result != output {
t.Errorf("expected [%s] got [%s]", output, result)
}
}
- Filter: Смятам, но не ме интересуваше особено. Сега след като го каза ме човърка да го оправя.
О, боже :D
func TestReduceWithSomethingDifferentThanConcat(t *testing.T) {
input := []string{"one", "two", "tree"}
output := "one"
result := Reduce(input, func(a string, b string) string {
if len(a) > 0 {
return a
}
return "bla?"
})
if result != output {
t.Errorf("expected [%s] got [%s]", output, result)
}
}
Не знам защо си представях, че единственото, което може да прави Reduce е да конкатенира хаха.