Задачка на GO: распаковка строки

Начинающий

Новичок
Пользователь
Сен 26, 2021
6
0
1
Привет, я самостоятельно изучаю Go, и с решеним одной из задач я пыхчу уже несколько дней, помогите пожалуйста.

Необходимо написать Go функцию, осуществляющую примитивную распаковку строки,
содержащую повторяющиеся символы/руны, например:
Код:
"a4bc2d5e" => "aaaabccddddde"
"abcd" => "abcd"
"3abc" => "" (некорректная строка)
"45" => "" (некорректная строка)
"aaa10b" => "" (некорректная строка)
"aaa0b" => "aab"
"" => ""
"d\n5abc" => "d\n\n\n\n\nabc"
В случае, если была передана некорректная строка, функция должна возвращать ошибку.
При необходимости можно выделять дополнительные функции / ошибки.

https://goplay.space/#hViyhbOXU8u

Код:
package hw02unpackstring

import (
    "errors"
    "strings"
    "unicode"
    "unicode/utf8"
)

var ErrInvalidString = errors.New("invalid string")

func Unpack(str string) (string, error) {
    var runeLast rune
    var strUnpacked string
    for i, w := 0, 0; i < len(str); i += w {
        runeValue, width := utf8.DecodeRuneInString(str[i:])
        w = width

        if runeLast == 0 {
            if unicode.IsDigit(runeValue) {
                return "", ErrInvalidString
            }
            runeLast = runeValue
            continue
        }

        if unicode.IsDigit(runeLast) && unicode.IsDigit(runeValue) {
            return "", ErrInvalidString
        }

        if !unicode.IsDigit(runeValue) || !unicode.IsLetter(runeLast) {
            // TODO: Если символ не должен умножаться на число, записывать символ в новую строку в исходном виде
            if unicode.IsLetter(runeLast) && unicode.IsLetter(runeValue) {
                strUnpacked += string(runeLast)
            }
            runeLast = runeValue
            continue
        }

        strUnpacked += strings.Repeat(string(runeLast), int(runeValue-'0'))
        runeLast = runeValue
    }
    if unicode.IsLetter(runeLast) {
        strUnpacked += string(runeLast)
    }

    return strUnpacked, nil
}

Тут я еще как-то смог решить, подскажите пожалуйста, как можно решить эту задачу проще?

Код:
    `qwe\4\5` => "qwe45"
    `qwe\45` => "qwe44444"
    `qwe\\5` => `qwe\\\\\`
    `qw\ne` => "" (некорректная строка)
Как видно из примера, заэкранировать можно только цифру или слэш.

Тут я окончательно застрял

Версия GO: go1.17.6 linux/amd64
ОСь: Ubuntu 20.04.3 LTS
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Привет, я самостоятельно изучаю Go, и с решеним одной из задач я пыхчу уже несколько дней, помогите пожалуйста.
И пункт задачи с повышенной сложностью, которую я никак не могу осилить, прошу вашей помощи
Вот пример (проверки из вашего поста вроде проходит):
C-подобный:
package hw02unpackstring

import (
    "fmt"
    "errors"
    "unicode"
)

var ErrInvalidString = errors.New("invalid string")


func Unpack(s string) (string, error) {
    sr := []rune(s)
    var s2 string
    var n int
    var backslash bool
    
    for i, item := range sr {
        if unicode.IsDigit(item) && i == 0 {
            return "", ErrInvalidString
        }

        if unicode.IsDigit(item) && unicode.IsDigit(sr[i - 1]) && sr[i - 2] != '\\' {
            return "", ErrInvalidString
        }             
        if item == '\\' && !backslash {
            backslash = true
            continue
        }   
        if backslash && unicode.IsLetter(item) {
            return "", ErrInvalidString
        }
        if backslash {
            s2 += string(item)
            backslash = false
            continue
        }
        if unicode.IsDigit(item) {
            n = int(item - '0')
            if n == 0 {
                s2 = s2[:len(s2) - 1]
                continue
            }
            for j := 0; j < n - 1; j ++ {   
                s2 += string(sr[i - 1])
            } 
            continue     
        }     
        s2 += string(item)
    }

    return s2, nil
}
 

Форум IT Специалистов