diff --git a/string-unpack/unpack.go b/string-unpack/unpack.go new file mode 100644 index 0000000..00d4f6a --- /dev/null +++ b/string-unpack/unpack.go @@ -0,0 +1,54 @@ +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 +} diff --git a/string-unpack/unpack_test.go b/string-unpack/unpack_test.go new file mode 100644 index 0000000..5015dbc --- /dev/null +++ b/string-unpack/unpack_test.go @@ -0,0 +1,44 @@ +package stringunpack_test + +import ( + "testing" + + stringunpack "git.grachevko.ru/grachevko/h/string-unpack" + "github.com/stretchr/testify/assert" +) + +func TestUnpack(t *testing.T) { + testcases := []struct { + input string + expected string + }{ + {input: "a4bc2d5e", expected: "aaaabccddddde"}, + {input: "abcd", expected: "abcd"}, + {input: "aaa0b", expected: "aab"}, + {input: "", expected: ""}, + {input: "d\n5abc", expected: "d\n\n\n\n\nabc"}, + } + + for _, tc := range testcases { + t.Run(tc.input, func(t *testing.T) { + result, err := stringunpack.Unpack(tc.input) + assert.NoError(t, err) + assert.Equal(t, tc.expected, result) + }) + } +} + +func TestUnpackIncorrectString(t *testing.T) { + testcases := []string{ + "3abc", + "45", + "aaa10b", + } + + for _, input := range testcases { + t.Run(input, func(t *testing.T) { + _, err := stringunpack.Unpack(input) + assert.Equal(t, stringunpack.ErrIncorrectString, err) + }) + } +}