55 lines
838 B
Go
55 lines
838 B
Go
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
|
|
}
|