Решение на Log Parsing от Цветелина Борисова

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

Към профила на Цветелина Борисова

Резултати

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

Код

package main
func Map(data []string, mapper func(string) string) []string {
result := []string{}
for _, value := range data {
result = append(result, mapper(value))
}
return result
}
func Filter(data []string, predicate func(string) bool) []string {
result := []string{}
for _, value := range data {
if predicate(value) {
result = append(result, value)
}
}
return result
}
func Reduce(data []string, combinator func(string, string) string) string {
if len(data) == 0 {
return ""
}
result := data[0]
for index := 1; index < len(data); index++ {
result = combinator(result, data[index])
}
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-1d6zmgp	0.011s
PASS
ok  	_/tmp/d20141023-10368-1d6zmgp	0.011s
PASS
ok  	_/tmp/d20141023-10368-1d6zmgp	0.011s
PASS
ok  	_/tmp/d20141023-10368-1d6zmgp	0.011s
PASS
ok  	_/tmp/d20141023-10368-1d6zmgp	0.011s
PASS
ok  	_/tmp/d20141023-10368-1d6zmgp	0.011s
PASS
ok  	_/tmp/d20141023-10368-1d6zmgp	0.011s
PASS
ok  	_/tmp/d20141023-10368-1d6zmgp	0.011s
PASS
ok  	_/tmp/d20141023-10368-1d6zmgp	0.011s
PASS
ok  	_/tmp/d20141023-10368-1d6zmgp	0.011s

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

Цветелина обнови решението на 18.10.2014 10:33 (преди над 3 години)

+package main
+
+func Map(data []string, mapper func(string) string) []string {
+
+ result := []string{}
+
+ for _, value := range data {
+ result = append(result, mapper(value))
+ }
+
+ return result
+}
+
+func Filter(data []string, predicate func(string) bool) []string {
+
+ result := []string{}
+
+ for _, value := range data {
+ if predicate(value) {
+ result = append(result, value)
+ }
+ }
+
+ return result
+}
+
+func Reduce(data []string, combinator func(string, string) string) string {
+
+ index := 0
+ result := ""
+
+ if len(data)%2 != 0 {
+ index++
+ result = data[0]
+ }
+
+ for ; index < len(data)-1; index++ {
+ result += combinator(data[index], data[index+1])
+ index = index + 1
+ }
+
+ 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
+}
  1. len(data)%2 != 0 ми харесва :).

  2. Не знам какво ви става на всичките с новите редове в началото на функцията - при теб поне е навсякъде.

  3. Сигурен ли си че for в Reduce-а не може да стане с по-малко очевидна аритметика :).

  4. Имаш ненужно копиране на масиви/слайсове и евентуалния memory leak (който не е чак толкова страшен).

Цветелина обнови решението на 18.10.2014 12:38 (преди над 3 години)

package main
func Map(data []string, mapper func(string) string) []string {
result := []string{}
for _, value := range data {
result = append(result, mapper(value))
}
return result
}
func Filter(data []string, predicate func(string) bool) []string {
result := []string{}
for _, value := range data {
if predicate(value) {
result = append(result, value)
}
}
return result
}
func Reduce(data []string, combinator func(string, string) string) string {
index := 0
result := ""
if len(data)%2 != 0 {
index++
result = data[0]
}
- for ; index < len(data)-1; index++ {
+ for ; index < len(data)-1; {
result += combinator(data[index], data[index+1])
- index = index + 1
+ index = index + 2
}
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
}

Благодаря за коментара. Това с новите редове не съм сигурна дали gofmt ги сложи или като е видял, че съм ги сложила и не ги е махнал. Reduce ми отне най-много време, опитах се сега да подобря аритметиката в 'for', a за memory leak не знаех. Как е по-добре да се направи без memory leak?

  1. go fmt не ги добавя но и не ги маха освен ако не са няколко поредни :)
  2. На второ четене (или по-точно докато си мислех за решенията ви на път да си платя интернета) len(data)%2 == 0 е готино, но не работи в някои случаи (къде половината).
  3. Memory leak-а е малък (при всички ви) и по големина на паметта(принципно) и по същество и се свежда до това че връщате слайсове под които може да стоят масиви по-големи отколкото реално погледнато ви трябват.
  4. Докато сме на темата със слайсовете - продължаваш да копираш ненужно пъти слайсове.

Цветелина обнови решението на 18.10.2014 14:45 (преди над 3 години)

package main
func Map(data []string, mapper func(string) string) []string {
-
- result := []string{}
-
- for _, value := range data {
- result = append(result, mapper(value))
+ for index, value := range data {
+ data[index] = mapper(value)
}
- return result
+ return data
}
func Filter(data []string, predicate func(string) bool) []string {
-
result := []string{}
for _, value := range data {
if predicate(value) {
result = append(result, value)
}
}
return result
}
func Reduce(data []string, combinator func(string, string) string) string {
-
index := 0
result := ""
if len(data)%2 != 0 {
index++
result = data[0]
}
for ; index < len(data)-1; {
result += combinator(data[index], data[index+1])
index = index + 2
}
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
}

Малко съм те забравил .... сори.

  1. Може ли да не променяш подаваните данни в Map?
  2. Всъщност докато го четох отново открих че пак съм чел по диагонал и ще трябва пак да си прочетеш условието за Reduce - нещо съвсем не работи като Reduce.

Цветелина обнови решението на 20.10.2014 21:52 (преди над 3 години)

package main
func Map(data []string, mapper func(string) string) []string {
- for index, value := range data {
- data[index] = mapper(value)
+
+ result := []string{}
+
+ for _, value := range data {
+ result = append(result, mapper(value))
}
- return data
+ return result
}
func Filter(data []string, predicate func(string) bool) []string {
+
result := []string{}
for _, value := range data {
if predicate(value) {
result = append(result, value)
}
}
return result
}
func Reduce(data []string, combinator func(string, string) string) string {
- index := 0
- result := ""
- if len(data)%2 != 0 {
- index++
- result = data[0]
+ if len(data) == 0 {
+ return ""
}
- for ; index < len(data)-1; {
- result += combinator(data[index], data[index+1])
- index = index + 2
+ result := data[0]
+
+ for index := 1; index < len(data); index++ {
+ result = combinator(result, data[index])
}
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
}