package stringunpack import ( "errors" "strconv" "strings" ) var ErrIncorrectString = errors.New("incorrect string") func Unpack(s string) (string, error) { if s == "" { return "", nil } var sb strings.Builder sb.Grow(len(s)) var curSymbol rune for _, r := range s { isNumber := false number := 0 if n, err := strconv.Atoi(string(r)); err == nil { number = n isNumber = true } if curSymbol == rune(0) { switch { case isNumber: return "", ErrIncorrectString case !isNumber: curSymbol = r } } else { switch { case !isNumber: sb.WriteRune(curSymbol) curSymbol = r case isNumber: for i := 0; i < number; i++ { sb.WriteRune(curSymbol) } curSymbol = rune(0) } } } if curSymbol != rune(0) { sb.WriteRune(curSymbol) } return sb.String(), nil }