4 из 8 тестов

This commit is contained in:
Илья Смышляев 2023-11-05 05:10:52 +03:00
parent db684c6ae7
commit c7f4da6c44
1 changed files with 66 additions and 16 deletions

View File

@ -2,28 +2,78 @@ package unpackstring
import (
"errors"
"regexp"
"strconv"
"strings"
"unicode"
)
var ErrInvalidString = errors.New("invalid string")
type state int
const (
start state = iota
escape
number
)
func Unpack(str string) (string, error) {
// Place your code here.
err := CheckString(str)
if err != nil {
return "", err
var currentState state = start
var result strings.Builder
numOfRepeat := 1
//if firstCheckString(&str) == true {
// return "", ErrInvalidString
//}
var runeArray = []rune(str)
if len(runeArray) > 0 && unicode.IsDigit(runeArray[0]) {
return "first rune is digit", ErrInvalidString
}
for i, char := range runeArray {
switch currentState {
case start:
if unicode.IsDigit(char) {
currentState = number
numOfRepeat, _ = strconv.Atoi(string(char))
} else if char == '\\' {
currentState = escape
} else {
currentState = start
result.WriteRune(char)
}
case number:
if unicode.IsDigit(char) {
return "", ErrInvalidString
}
repStr, err := repeatRune(runeArray[i-2], numOfRepeat)
if err != nil {
res := result.String()
result.Reset()
result.WriteString(res[0 : len(res)-1])
}
result.WriteString(repStr)
currentState = start
result.WriteRune(char)
case escape:
result.WriteRune(char)
}
}
return result.String(), nil
}
func repeatRune(char rune, numOfRepeat int) (string, error) {
if numOfRepeat > 0 {
return strings.Repeat(string(char), numOfRepeat-1), nil
}
if numOfRepeat == 0 {
return "", errors.New("zero repeat")
}
return "", nil
}
func CheckString(str string) error {
re, _ := regexp.Compile(`^\d|\d{2,}`)
if re.MatchString(str) == true {
return ErrInvalidString
}
return nil
}