Решение на Log Parsing от Красимир Стойков

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

Към профила на Красимир Стойков

Резултати

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

Код

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

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

PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.011s
PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.011s
PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.011s
PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.011s
PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.011s
PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.011s
PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.011s
PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.031s
PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.011s
PASS
ok  	_/tmp/d20141023-10368-ijykv4	0.011s

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

Красимир обнови решението на 20.10.2014 23:53 (преди над 3 години)

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

Предполагам, че мога да използвам make в началото на map, пък защо не и в filter, за да заделя slice с големина на подадения. Така няма да се налага да използвам append? С обикновен масив май няма да стане, защото на лекциите покахте, че не можем да създаваме статичен масив с големина според някоя променлива? Или това не важи за в тялото на функции? ;Д

Красимир обнови решението на 21.10.2014 11:58 (преди над 3 години)

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

Няма проблем да използваш make. Със сигурност ти трябва да направиш нещо, което да върнеш.

Интересен Filter. Не знам защо си го написал така. Ако предполагам правилно - не се страхувай да използваш append многократно в цикъла. Стига да си заделил достатъчно място при създаването няма да се копират памети докато не стигнеш до края на заделеното място. Може да видиш тази статия по въпроса ако не сме били ясни по време на лекцията.

Мерси за отговора :) В началото използвах "append" в циклите, но за да спестя някой и друг ред инициализирах празен масив при типа на резултата от ф-ята, което водеше до многобройни копирания на памети. Също "filter" го написах така, защото не исках да връщам масив с по-голяма дължина отколкото реално ползвам... Иначе, за протокола, изглежда по някое време ще да съм останал с някакво заблуждение, че "append" винаги заделя още памет, въпреки че бяхте пределно ясни по този въпрос на лекциите, моя грешка. Предполагам, заблудата ми идва оттам, че съм over-заключил (ха-ха) за "невидимите" копирания, за които спомена Михаил Стойков... май този коментар е излишен, както и да е, написах го вече....