From e11af6c5672fb96c945a72126c5fb0ca86c18001 Mon Sep 17 00:00:00 2001
From: linbergil <smyshlyaev.il@yandex.ru>
Date: Wed, 1 Nov 2023 03:41:17 +0300
Subject: [PATCH 1/3] add string verifying w/ regex

---
 go.mod    |  7 ++++++-
 go.sum    |  4 ++++
 unpack.go | 13 +++++++++++--
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/go.mod b/go.mod
index 903e38a..556108e 100644
--- a/go.mod
+++ b/go.mod
@@ -2,9 +2,14 @@ module unpackstring
 
 go 1.19
 
-require github.com/stretchr/testify v1.7.0
+require (
+	github.com/gijsbers/go-pcre v0.0.0-20161214203829-a84f3096ab3c
+	github.com/stretchr/testify v1.7.0
+)
 
 require (
+	github.com/GRbit/go-pcre v1.0.1 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/pmezard/go-difflib v1.0.0 // indirect
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
 )
diff --git a/go.sum b/go.sum
index c221f64..4e8258b 100644
--- a/go.sum
+++ b/go.sum
@@ -1,6 +1,10 @@
+github.com/GRbit/go-pcre v1.0.1 h1:8F7Wj1rxIq8ejKSXVVW2wE+4I4VnZbuOemrMk8kn3hc=
+github.com/GRbit/go-pcre v1.0.1/go.mod h1:0g7qVGbMpd2Odevd92x1RpaLpR3c3F/Gv2HEnI7CwEA=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/gijsbers/go-pcre v0.0.0-20161214203829-a84f3096ab3c h1:o5z/Stj4aWUiDiCVFdEOgXcwNF+Z7mQSlvDTaWBK98Q=
+github.com/gijsbers/go-pcre v0.0.0-20161214203829-a84f3096ab3c/go.mod h1:Bd83Kcti1U5OMXYYTjilhd6os+l6AmlTMVbDtaBvycQ=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
diff --git a/unpack.go b/unpack.go
index 75d811a..17d9b48 100644
--- a/unpack.go
+++ b/unpack.go
@@ -2,12 +2,21 @@ package unpackstring
 
 import (
 	"errors"
+	"github.com/GRbit/go-pcre"
 )
 
 var ErrInvalidString = errors.New("invalid string")
 
-func Unpack(_ string) (string, error) {
+func Unpack(str string) (string, error) {
 	// Place your code here.
-	// test
+
+	re, _ := pcre.Compile(`^\d|\d{2,}|\\(?=\D)|(?=\\)`, pcre.UTF8)
+
+	res := re.MatchStringWFlags(str, pcre.UTF8)
+
+	if res == true {
+		return "", ErrInvalidString
+	}
+
 	return "", nil
 }

From db684c6ae720e0acb62b7cb3cfa2dda09e8b335e Mon Sep 17 00:00:00 2001
From: linbergil <smyshlyaev.il@yandex.ru>
Date: Wed, 1 Nov 2023 23:05:25 +0300
Subject: [PATCH 2/3] delete PCRE regex

---
 unpack.go | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/unpack.go b/unpack.go
index 17d9b48..ddffac4 100644
--- a/unpack.go
+++ b/unpack.go
@@ -2,21 +2,28 @@ package unpackstring
 
 import (
 	"errors"
-	"github.com/GRbit/go-pcre"
+	"regexp"
 )
 
 var ErrInvalidString = errors.New("invalid string")
 
 func Unpack(str string) (string, error) {
 	// Place your code here.
-
-	re, _ := pcre.Compile(`^\d|\d{2,}|\\(?=\D)|(?=\\)`, pcre.UTF8)
-
-	res := re.MatchStringWFlags(str, pcre.UTF8)
-
-	if res == true {
-		return "", ErrInvalidString
+	err := CheckString(str)
+	if err != nil {
+		return "", err
 	}
 
 	return "", nil
 }
+
+func CheckString(str string) error {
+
+	re, _ := regexp.Compile(`^\d|\d{2,}`)
+
+	if re.MatchString(str) == true {
+		return ErrInvalidString
+	}
+
+	return nil
+}

From c7f4da6c44baa134d157e07b7b691ba695e3d6dd Mon Sep 17 00:00:00 2001
From: linbergil <smyshlyaev.il@yandex.ru>
Date: Sun, 5 Nov 2023 05:10:52 +0300
Subject: [PATCH 3/3] =?UTF-8?q?4=20=D0=B8=D0=B7=208=20=D1=82=D0=B5=D1=81?=
 =?UTF-8?q?=D1=82=D0=BE=D0=B2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 unpack.go | 82 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 66 insertions(+), 16 deletions(-)

diff --git a/unpack.go b/unpack.go
index ddffac4..ea9a1bd 100644
--- a/unpack.go
+++ b/unpack.go
@@ -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
-}