Решение на Log Parsing от Шенай Мустафа

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

Към профила на Шенай Мустафа

Резултати

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

Код

package main
func Map(data []string, mapper func(string) string) []string {
length := len(data)
var result []string
result = make([]string, 0, length)
for _, value := range data {
result = append(result, mapper(value))
}
return result
}
func Filter(data []string, predicate func(string) bool) []string {
length := len(data)
var result []string
result = make([]string, 0, length)
for _, value := range data {
if predicate(value) {
result = append(result, value)
}
}
return result
}
func Reduce(data []string, combinator func(string, string) string) string {
length := len(data)
if length == 0 {
return ""
}
result := data[0]
input := data[1:length]
for _, value := range input {
result = combinator(result, value)
}
return result
}
func Any(data []string, predicate func(string) bool) bool {
for _, value := range data {
if predicate(value) {
return true
}
}
return false
}
func All(data []string, predicate func(string) bool) bool {
for _, value := range data {
if !predicate(value) {
return false
}
}
return true
}

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

PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.011s
PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.011s
PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.011s
PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.013s
PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.011s
PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.011s
PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.011s
PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.011s
PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.011s
PASS
ok  	_/tmp/d20141023-10368-4fdryk	0.011s

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

Шенай обнови решението на 21.10.2014 16:02 (преди над 3 години)

+package main
+
+func Map(data []string, mapper func(string) string) []string {
+ length := len(data)
+ var result []string
+ result = make([]string, 0, length)
+ for _, value := range data {
+ result = append(result, mapper(value))
+ }
+
+ return result
+}
+
+func Filter(data []string, predicate func(string) bool) []string {
+ length := len(data)
+ var result []string
+ result = make([]string, 0, length)
+ for _, value := range data {
+ if predicate(value) {
+ result = append(result, value)
+ }
+ }
+ return result
+}
+
+func Reduce(data []string, combinator func(string, string) string) string {
+ length := len(data)
+ if length == 0 {
+ return ""
+ }
+
+ result := data[0]
+ input := data[1:length]
+
+ for _, value := range input {
+ result = combinator(result, value)
+ }
+ return result
+
+}
+
+func Any(data []string, predicate func(string) bool) bool {
+ for _, value := range data {
+ if predicate(value) {
+ return true
+ }
+ }
+
+ return false
+}
+
+func All(data []string, predicate func(string) bool) bool {
+ for _, value := range data {
+ if !predicate(value) {
+ return false
+ }
+ }
+
+ return true
+}

Виждам, че често правиш length := len(data). Това е разумно поведение, когато определянето на дължината е "сложна" операция и нямам нищо против това в решението ти.

Но ако сме пропуснали да споменем: len (както и cap) извикан върху някой slice работи с константна сложност. Всъщност в хедъра на слайса се пази дължината му и не се обхожда всеки път. Тази статия на Rob Pike е много интересна и обяснява много неща в по - голям детайл от това, което ние направихме.

Всъщност аз виждам смисъл от length := len(data), когато ти се налага на няколко пъти да използваш резултата, защото извикваш по-малко функции, но ако ти е нужно само веднъж да знаеш тази дължина (както си имплементирала Map и Filter), няма нужда да пазиш дължината в променлива.