Решение на Разлика в сумите от Диана Генева

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

Към профила на Диана Генева

Резултати

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

Код

package main
import "strings"
const dataLength = 19
func ExtractColumn(logContents string, column uint8) string {
if strings.TrimSpace(logContents) == "" {
return ""
}
var logColumns, lastColumns []string
var ipv4, message, time string
for _, line := range strings.Split(strings.TrimSpace(logContents), "\n") {
time = line[:dataLength]
lastColumns = strings.SplitN(line[(dataLength+1):], " ", 2)
ipv4, message = lastColumns[0], lastColumns[1]
logColumns = append(logColumns, []string{time, ipv4, message}[column])
}
return strings.Join(logColumns[:], "\n") + "\n"
}

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

PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.005s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
--- FAIL: TestSpacesAtTheStartOrEndOfALine (0.00s)
	solution_test.go:260: Expected
		---
		As far as we can tell this is a DNS
		Yet another DNS, how quaint!
		There is definitely some trend here
		 Some spaces at the beginning of this line
		Nothing particularly interesting happened 
		
		---
		but found
		---
		As far as we can tell this is a DNS
		Yet another DNS, how quaint!
		There is definitely some trend here
		 Some spaces at the beginning of this line
		Nothing particularly interesting happened
		
		---
FAIL
exit status 1
FAIL	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.003s
PASS
ok  	_/tmp/d20151103-24541-aqoe2y	0.004s

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

Диана обнови решението на 23.10.2015 15:16 (преди над 2 години)

+package main
+
+import "strings"
+
+func ExtractColumn(logContents string, column uint8) (logColumns string){
+ var ipv4, message, time string;
+ for _, line := range strings.Split(strings.TrimSpace(logContents), "\n"){
+ time = line[0:19];
+ ipv4 = strings.Split(line[20:], " ")[0];
+ message = strings.Split(line[20:], " ")[1];
+ logColumns += ([] string{time, ipv4, message}[column]) + "\n";
+ }
+ return;
+}

Диана обнови решението на 23.10.2015 15:23 (преди над 2 години)

package main
import "strings"
func ExtractColumn(logContents string, column uint8) (logColumns string){
var ipv4, message, time string;
for _, line := range strings.Split(strings.TrimSpace(logContents), "\n"){
time = line[0:19];
ipv4 = strings.Split(line[20:], " ")[0];
- message = strings.Split(line[20:], " ")[1];
+ message = strings.Join(strings.Split(line[20:], " ")[1:], " ");
logColumns += ([] string{time, ipv4, message}[column]) + "\n";
}
return;
-}
+}

Диана обнови решението на 23.10.2015 19:03 (преди над 2 години)

package main
import "strings"
-func ExtractColumn(logContents string, column uint8) (logColumns string){
- var ipv4, message, time string;
- for _, line := range strings.Split(strings.TrimSpace(logContents), "\n"){
- time = line[0:19];
- ipv4 = strings.Split(line[20:], " ")[0];
- message = strings.Join(strings.Split(line[20:], " ")[1:], " ");
- logColumns += ([] string{time, ipv4, message}[column]) + "\n";
+func ExtractColumn(logContents string, column uint8) (logColumns string) {
+ var ipv4, message, time string
+ for _, line := range strings.Split(strings.TrimSpace(logContents), "\n") {
+ if line != "" {
+ time = line[0:19]
+ ipv4 = strings.Split(line[20:], " ")[0]
+ message = strings.Join(strings.Split(line[20:], " ")[1:], " ")
+ logColumns += ([]string{time, ipv4, message}[column]) + "\n"
+ }
}
- return;
+ return
}

Хубаво решение(най-краткото като редове към момента), но:

  1. не съм убеден че единия if е проблем :) и не виждам как би го махнал, но може да го преместиш - предвид това че знаеш кога се случва
  2. можеш да не сплитваш по няколко пъти
  3. 19, 20 са хубави числа но нищо не говорят
  4. line[:a] === lines[0:a] също както line[a:] === line[a: len(line)]
  5. конкатенацията на стрингове прави нов стрингове в текущия случай може да се избегне

навярно ако оправиш всяка точка няма да е най-краткото решение вече, но не даваме бонус точки за най малко редове код :)

п.п. Ruby?

Диана обнови решението на 25.10.2015 23:25 (преди над 2 години)

package main
import "strings"
-func ExtractColumn(logContents string, column uint8) (logColumns string) {
+func ExtractColumn(logContents string, column uint8) string {
+ if strings.TrimSpace(logContents) == ""{
+ return ""
+ }
+ const dataLength = 19
+ var logColumns []string
var ipv4, message, time string
for _, line := range strings.Split(strings.TrimSpace(logContents), "\n") {
- if line != "" {
- time = line[0:19]
- ipv4 = strings.Split(line[20:], " ")[0]
- message = strings.Join(strings.Split(line[20:], " ")[1:], " ")
- logColumns += ([]string{time, ipv4, message}[column]) + "\n"
- }
+ time = line[:dataLength]
+ ipv4, message= strings.SplitN(line[(dataLength + 1):], " ", 2)[0], strings.SplitN(line[(dataLength + 1):], " ", 2)[1]
+ logColumns = append(logColumns, []string{time, ipv4, message}[column])
}
- return
-}
+ return (strings.Join(logColumns[:],"\n") + "\n")
+}

Диана обнови решението на 25.10.2015 23:28 (преди над 2 години)

package main
import "strings"
func ExtractColumn(logContents string, column uint8) string {
- if strings.TrimSpace(logContents) == ""{
+ if strings.TrimSpace(logContents) == "" {
return ""
}
const dataLength = 19
- var logColumns []string
+ var logColumns []string
var ipv4, message, time string
for _, line := range strings.Split(strings.TrimSpace(logContents), "\n") {
- time = line[:dataLength]
- ipv4, message= strings.SplitN(line[(dataLength + 1):], " ", 2)[0], strings.SplitN(line[(dataLength + 1):], " ", 2)[1]
- logColumns = append(logColumns, []string{time, ipv4, message}[column])
+ time = line[:dataLength]
+ ipv4, message = strings.SplitN(line[(dataLength+1):], " ", 2)[0], strings.SplitN(line[(dataLength+1):], " ", 2)[1]
+ logColumns = append(logColumns, []string{time, ipv4, message}[column])
}
- return (strings.Join(logColumns[:],"\n") + "\n")
-}
+ return (strings.Join(logColumns[:], "\n") + "\n")
+}

не става (много) по-голямо мазало :wink: , но:

  1. константите обикновенно са глобални, тоест не се дефинират вътре във функциите
  2. продължаваш да сплитваш по-няколко пъти еднакво strings.SplitN(line[(dataLength+1):], " ", 2), което и води до онзи много дълъг ред
  3. не мисля че скобите при return-а са нужни

иначе на мен ми харесва повече особенно strings.Join

Диана обнови решението на 26.10.2015 16:25 (преди над 2 години)

package main
import "strings"
+const dataLength = 19
+
func ExtractColumn(logContents string, column uint8) string {
if strings.TrimSpace(logContents) == "" {
return ""
}
- const dataLength = 19
- var logColumns []string
+ var logColumns, lastColumns []string
var ipv4, message, time string
for _, line := range strings.Split(strings.TrimSpace(logContents), "\n") {
time = line[:dataLength]
- ipv4, message = strings.SplitN(line[(dataLength+1):], " ", 2)[0], strings.SplitN(line[(dataLength+1):], " ", 2)[1]
+ lastColumns = strings.SplitN(line[(dataLength+1):], " ", 2)
+ ipv4, message = lastColumns[0], lastColumns[1]
logColumns = append(logColumns, []string{time, ipv4, message}[column])
}
- return (strings.Join(logColumns[:], "\n") + "\n")
+ return strings.Join(logColumns[:], "\n") + "\n"
}