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

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

Към профила на Даниел Тасков

Резултати

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

Код

package main
import (
"bytes"
"strings"
)
func extractColumnFromLine(line *string, column uint8, buffer *bytes.Buffer) {
fields := strings.Split(*line, " ")
switch column {
case 0:
buffer.WriteString(strings.Join(fields[:2], " "))
case 1:
buffer.WriteString(fields[2])
case 2:
buffer.WriteString(strings.Join(fields[3:], " "))
}
buffer.WriteString("\n")
}
func ExtractColumn(logContents string, column uint8) string {
lines := strings.Split(logContents, "\n")
var buffer bytes.Buffer
for i := 0; i < len(lines); i++ {
if lines[i] != "" {
extractColumnFromLine(&lines[i], column, &buffer)
}
}
return buffer.String()
}

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

PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.004s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.005s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s
PASS
ok  	_/tmp/d20151103-24541-2wk0nk	0.003s

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

Даниел обнови решението на 21.10.2015 13:49 (преди над 2 години)

+package main
+
+import (
+ "fmt"
+ "strings"
+)
+
+func extractColumnFromLine(line *string, column uint8) {
+ if *line == "" {
+ return
+ }
+
+ fields := strings.Split(*line, " ")
+
+ switch column {
+ case 0:
+ *line = strings.Join(fields[:1], " ")
+ case 1:
+ *line = fields[2]
+ case 2:
+ *line = strings.Join(fields[3:], " ")
+ }
+}
+
+func ExtractColumn(logContents string, column uint8) string {
+ lines := strings.Split(logContents, "\n")
+
+ for i := 0; i < len(lines); i++ {
+ extractColumnFromLine(&lines[i], column)
+ }
+
+ result := strings.Join(lines, "\n")
+
+ if lines[len(lines)-1] == "" {
+ return result
+ } else {
+ return fmt.Sprintf("%s\n", result)
+ }
+}

Даниел обнови решението на 21.10.2015 14:17 (преди над 2 години)

package main
import (
- "fmt"
+ "bytes"
"strings"
)
-func extractColumnFromLine(line *string, column uint8) {
+func extractColumnFromLine(line *string, column uint8, buffer *bytes.Buffer) {
if *line == "" {
return
}
fields := strings.Split(*line, " ")
switch column {
case 0:
- *line = strings.Join(fields[:1], " ")
+ buffer.WriteString(strings.Join(fields[:1], " "))
case 1:
- *line = fields[2]
+ buffer.WriteString(fields[2])
case 2:
- *line = strings.Join(fields[3:], " ")
+ buffer.WriteString(strings.Join(fields[3:], " "))
}
+ buffer.WriteString("\n")
}
func ExtractColumn(logContents string, column uint8) string {
- lines := strings.Split(logContents, "\n")
+ lines := strings.Split(strings.TrimRight(logContents, "\n"), "\n")
+ var buffer bytes.Buffer
for i := 0; i < len(lines); i++ {
- extractColumnFromLine(&lines[i], column)
+ extractColumnFromLine(&lines[i], column, &buffer)
}
- result := strings.Join(lines, "\n")
-
+ return buffer.String()
- if lines[len(lines)-1] == "" {
+}
- return result
- } else {
- return fmt.Sprintf("%s\n", result)
- }
-}

Даниел обнови решението на 21.10.2015 14:30 (преди над 2 години)

package main
import (
"bytes"
"strings"
)
func extractColumnFromLine(line *string, column uint8, buffer *bytes.Buffer) {
if *line == "" {
return
}
fields := strings.Split(*line, " ")
switch column {
case 0:
buffer.WriteString(strings.Join(fields[:1], " "))
case 1:
buffer.WriteString(fields[2])
case 2:
buffer.WriteString(strings.Join(fields[3:], " "))
}
buffer.WriteString("\n")
}
func ExtractColumn(logContents string, column uint8) string {
- lines := strings.Split(strings.TrimRight(logContents, "\n"), "\n")
+ lines := strings.Split(logContents, "\n")
var buffer bytes.Buffer
for i := 0; i < len(lines); i++ {
extractColumnFromLine(&lines[i], column, &buffer)
}
return buffer.String()
}

Даниел обнови решението на 24.10.2015 01:29 (преди над 2 години)

package main
import (
"bytes"
"strings"
)
func extractColumnFromLine(line *string, column uint8, buffer *bytes.Buffer) {
- if *line == "" {
- return
- }
-
fields := strings.Split(*line, " ")
switch column {
case 0:
buffer.WriteString(strings.Join(fields[:1], " "))
case 1:
buffer.WriteString(fields[2])
case 2:
buffer.WriteString(strings.Join(fields[3:], " "))
}
buffer.WriteString("\n")
}
func ExtractColumn(logContents string, column uint8) string {
lines := strings.Split(logContents, "\n")
var buffer bytes.Buffer
for i := 0; i < len(lines); i++ {
- extractColumnFromLine(&lines[i], column, &buffer)
+ if lines[i] != "" {
+ extractColumnFromLine(&lines[i], column, &buffer)
+ }
}
return buffer.String()
-}
+}

Направо да връщам низ? Имах и вариант в който връщам низ, а буферът е в главната функция, но така ми се стори по-удачно за момента, сега като се замисля, не знам защо..

П.С.: А, заради копирането на низовете. Няма ли да е по-пестеливо така с буфер?

онзи ни слайд е бил писан с идеята да покаже че ако се копират големи неща е проблемно.

Разбира се никой не е проверил дали string като се копира се копират и байтовете описващи текста или само някакъв указател и дължина и отговора е указател с големина, което изобщо не е учудващо - просто никой не го е проверил.

Мисля че се поправихме втория час, след като го преоткрихме в почивката, но може да сме забравили или да не сме наблегнали достатъчно

Даниел обнови решението на 25.10.2015 21:04 (преди над 2 години)

package main
import (
- "bytes"
- "strings"
+ "bytes"
+ "strings"
)
func extractColumnFromLine(line *string, column uint8, buffer *bytes.Buffer) {
- fields := strings.Split(*line, " ")
+ fields := strings.Split(*line, " ")
- switch column {
- case 0:
- buffer.WriteString(strings.Join(fields[:1], " "))
- case 1:
- buffer.WriteString(fields[2])
- case 2:
- buffer.WriteString(strings.Join(fields[3:], " "))
- }
- buffer.WriteString("\n")
+ switch column {
+ case 0:
+ buffer.WriteString(strings.Join(fields[0:2], " "))
+ case 1:
+ buffer.WriteString(strings.Join(fields[2:3], " "))
+ case 2:
+ buffer.WriteString(strings.Join(fields[3:], " "))
+ }
+ buffer.WriteString("\n")
}
func ExtractColumn(logContents string, column uint8) string {
- lines := strings.Split(logContents, "\n")
- var buffer bytes.Buffer
+ lines := strings.Split(logContents, "\n")
+ var buffer bytes.Buffer
- for i := 0; i < len(lines); i++ {
- if lines[i] != "" {
- extractColumnFromLine(&lines[i], column, &buffer)
- }
- }
+ for i := 0; i < len(lines); i++ {
+ if lines[i] != "" {
+ extractColumnFromLine(&lines[i], column, &buffer)
+ }
+ }
- return buffer.String()
-}
+ return buffer.String()
+}

Даниел обнови решението на 25.10.2015 21:05 (преди над 2 години)

package main
import (
"bytes"
"strings"
)
func extractColumnFromLine(line *string, column uint8, buffer *bytes.Buffer) {
fields := strings.Split(*line, " ")
switch column {
case 0:
- buffer.WriteString(strings.Join(fields[0:2], " "))
+ buffer.WriteString(strings.Join(fields[:2], " "))
case 1:
- buffer.WriteString(strings.Join(fields[2:3], " "))
+ buffer.WriteString(fields[2])
case 2:
buffer.WriteString(strings.Join(fields[3:], " "))
}
buffer.WriteString("\n")
}
func ExtractColumn(logContents string, column uint8) string {
lines := strings.Split(logContents, "\n")
var buffer bytes.Buffer
for i := 0; i < len(lines); i++ {
if lines[i] != "" {
extractColumnFromLine(&lines[i], column, &buffer)
}
}
return buffer.String()
}