Решение на Log Parsing от Илия Ячев

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

Към профила на Илия Ячев

Резултати

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

Код

package main
func Map(data []string, mapper func(string) string) []string {
result := make([]string, len(data))
for i, value := range data {
result[i] = mapper(value)
}
return result
}
func Filter(data []string, predicate func(string) bool) []string {
result := make([]string, 0, len(data))
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 ""
}
memo := data[0]
for _, value := range data[1:] {
memo = combinator(memo, value)
}
return memo
}
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-1amhcha	0.011s
PASS
ok  	_/tmp/d20141023-10368-1amhcha	0.011s
PASS
ok  	_/tmp/d20141023-10368-1amhcha	0.011s
PASS
ok  	_/tmp/d20141023-10368-1amhcha	0.012s
PASS
ok  	_/tmp/d20141023-10368-1amhcha	0.011s
PASS
ok  	_/tmp/d20141023-10368-1amhcha	0.011s
PASS
ok  	_/tmp/d20141023-10368-1amhcha	0.011s
PASS
ok  	_/tmp/d20141023-10368-1amhcha	0.011s
PASS
ok  	_/tmp/d20141023-10368-1amhcha	0.011s
PASS
ok  	_/tmp/d20141023-10368-1amhcha	0.012s

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

Илия обнови решението на 15.10.2014 02:25 (преди над 3 години)

+package main
+
+func Map(data []string, mutator func(string) string) []string {
+ for i, value := range data {
+ data[i] = mutator(value)
+ }
+ return data
+}
+
+func Filter(data []string, predicate func(string) bool) []string {
+ var 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 {
+ memo := ""
+ for _, value := range data {
+ memo = combinator(memo, value)
+ }
+ return memo
+}
+
+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
+}

Илия обнови решението на 15.10.2014 02:53 (преди над 3 години)

package main
func Map(data []string, mutator func(string) string) []string {
for i, value := range data {
data[i] = mutator(value)
}
return data
}
func Filter(data []string, predicate func(string) bool) []string {
- var result []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 {
memo := ""
for _, value := range data {
memo = combinator(memo, value)
}
return memo
}
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
}

Всички операции над slice работят - просто нямаш масив под slice поради което append директно ти прави нов масив и прави slice върху него.

Не знам дали пак (тъй като и миналата година го имаше това) е било казано че ще гърми ако slice не е инициализиран - няма голям смисъл - обикновено не е и практично да не си го инициализираш :).

тук забелязах нещо върху което не се бях замислял - всъщност nil slice-а се държи като slice с дължина 0 с изключение на случай със сравняване с nil.

Да, точно понеже рядко ще има причина да не се инициализира се очудих от нуждата от експлицитна инициализация чрез make.

Да и аз затова питах във форума въпроса за nil.

Илия обнови решението на 15.10.2014 15:12 (преди над 3 години)

package main
-func Map(data []string, mutator func(string) string) []string {
+func Map(data []string, mapper func(string) string) []string {
+ result := make([]string, len(data))
+
for i, value := range data {
- data[i] = mutator(value)
+ result[i] = 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 {
memo := ""
for _, value := range data {
memo = combinator(memo, value)
}
return memo
}
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
}

Илия обнови решението на 21.10.2014 00:04 (преди над 3 години)

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

Когато видях отговора ти за началната стойност за Reduce знаех, че трябва да променя имплементацията, за да съответства с него, но после забравих да го променя.

За Filter зададох cap-ът да бъде размера на подадените данни. Все си мисля, че ако повечето ще останат след филтъра, то значи би било по-ефективно не да се добавят тези които се взимат, а да се направи копие и да се премахнат невалидните, но някакси

arr = append(arr[:i], arr[i+1:]...)

този синтаксис ми подсказва, че сигурно няма да е по-ефективно (correct me if I'm wrong).

Обръщане към обикновен списък, премахването и обръщането обратно в масив (slice) ми звучи добре, но не съм абсолютно сигурен дали наистина ще е продуктивно (без benchmark няма как да съм сигурен), а и засега не сте показвали container/list.

Илия, аз бих си задал cap-а да е len(data)/2 ... Така в най-лошия случай ще имаш едно заделяне и същия брой излишни елементи, които ще имаш и ти - len(data)/2 - 1. Другия ти най-лош е да нямаш валидни елементи и да имаш заделен масив с len(data)/2 празни елементи, а ти би имал len(data) празни елементи.