Разбейте текст по пробелам и проверяйте Unicode-письменность всех букв слова. Кириллицу оставляйте, для латиницы возвращайте число кодовых точек; смешанные слова требуют отдельного правила.
Функция для разбивки текста на отдельные токены
Разбейте текст по пробелам и проверяйте Unicode-письменность всех букв слова. Кириллицу оставляйте, для латиницы возвращайте число кодовых точек; смешанные слова требуют отдельного правила.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте функцию, принимающую поток символов текста. Необходимо разбить входную строку на отдельные слова, где разделителем считается пробел. Для каждого полученного слова определите, написано ли оно кириллическими символами или латинскими. Если слово состоит из кириллических букв, выведите его в исходном виде; если слово написано латиницей — выведите только его длину. Порядок вывода слов/длин может быть произвольным.
Ответ
Разбейте текст по пробелам и проверяйте Unicode-письменность всех букв слова. Кириллицу оставляйте, для латиницы возвращайте число кодовых точек; смешанные слова требуют отдельного правила.
Ниже смешанные слова, цифры и пунктуация считаются ошибкой; повторные пробелы пропускаются. Нужны fmt, strconv, strings, unicode, unicode/utf8:
func tokens(text string) ([]string, error) {
if !utf8.ValidString(text) { return nil, fmt.Errorf("invalid UTF-8") }
result := make([]string, 0)
for _, word := range strings.Split(text, " ") {
if word == "" { continue }
cyrillic, latin := true, true
for _, r := range word {
cyrillic = cyrillic && unicode.IsLetter(r) && unicode.Is(unicode.Cyrillic, r)
latin = latin && unicode.IsLetter(r) && unicode.Is(unicode.Latin, r)
}
switch {
case cyrillic: result = append(result, word)
case latin: result = append(result, strconv.Itoa(utf8.RuneCountInString(word)))
default: return nil, fmt.Errorf("unsupported token")
}
}
return result, nil
}
Это функция для строки по формулировке условия. Для большого io.Reader обрабатывайте поток с сохранением незаконченного слова и границы UTF-8. Если разделитель — любой whitespace, замените Split на Fields.