Георги обнови решението на 15.10.2013 01:55 (преди над 4 години)
+package main
+
+import (
+ "fmt"
+ "strings"
+)
+
+func parsePath(path string) string {
+ pathParts := strings.Split(path, "/")
+ numPathParts := len(pathParts)
+ var resultPathParts []string
+ curPart := 0
+ if numPathParts > 0 {
+ if pathParts[0] == ".." || pathParts[0] == "." {
+ if numPathParts > 1 && pathParts[1] == ".." {
+ curPart++
+ }
+ curPart++
+ }
+ for ; curPart < numPathParts; curPart++ {
+ if pathParts[curPart] == ".." {
+ _, resultPathParts = resultPathParts[len(resultPathParts)-1],
+ resultPathParts[:len(resultPathParts)-1]
+ } else if pathParts[curPart] != "" {
+ resultPathParts = append(resultPathParts, pathParts[curPart])
+ }
+ }
+ }
+ result := "/"
+ for curPart = 0; curPart < len(resultPathParts); curPart++ {
+ result += resultPathParts[curPart] + "/"
+ }
+ return result
+}
Имаш интересно решение. Ползването на външен итератор е готино но прави кода по-труден за четене. Добре ще е, ако намериш начин да го обединиш с for-а и да си ползваш локален итератор. Другия ми коментар е относно цикъла, който сглобява резултата. Можеш да го заместиш с strings.Join(resultPathParts, "/").