Go []rune: разворот строки UTF-8 без порчи кириллицы
Перевёртыш на рунах
Кириллица устроена иначе, чем латиница: каждый её символ занимает в памяти несколько байтов, и наивная попытка пройтись по строке с конца, опираясь на позиции байтов, неизбежно разрежет букву пополам и превратит текст в мусор. Чтобы обращаться с текстом корректно, нужно мыслить не байтами, а целыми символами — теми самыми неделимыми единицами, которые на практике называют рунами.
Задача состоит в том, чтобы взять произвольную строку, введённую пользователем, и получить её зеркальное отражение: последний символ становится первым, предпоследний — вторым, и так до самого начала. При этом каждый многобайтный символ должен остаться нетронутым — буква «я» не теряет ни одного из своих байтов и не сливается с соседом.
Когда зеркальная копия построена, её естественно сравнить с оригиналом. Совпадение означает, что строка читается одинаково в обоих направлениях — это свойство, которое издавна привлекает внимание и рождает симметричные слова и фразы на самых разных языках. Сравнение проводится честно: регистр не приводится к единому виду, пробелы не выбрасываются, строки берутся такими, какими их написал пользователь.
В итоге программа выводит развёрнутую строку и сообщает, совпала ли она с исходной, — два простых факта, которые вместе дают полное представление о симметрии введённого текста.
Что нужно сделать
Реализуйте функцию RuneMirror(text string) []string. Преобразуйте строку в []rune, разверните руны, соберите строку обратно и верните срез из двух строк: развёрнутый текст и yes, если он в точности равен исходному, иначе no. Регистр, пробелы и знаки препинания не изменяются.
Ввод и вывод
Функция получает одну строку и возвращает []string{развёрнутаяСтрока, признак}. Читать stdin и печатать результат не нужно.
Пример
RuneMirror("топот") возвращает []string{"топот", "yes"}, а RuneMirror("Go🙂") — []string{"🙂oG", "no"}.
Пример
- Ввод
["топот"]
- Вывод
["топот","yes"]
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Go fmt.Sprintf: форматирование строки и числа с двумя знаками
- Go strings.Split и strconv.ParseFloat: сумма чисел в строке
- Go encoding/json: фильтрация потока JSON по полю alert
- Go strings: проверка имени файла и расширения перед загрузкой
- Go if и switch: несколько значений в одной ветке
- Go pointer receiver и встраивание struct: изменяемый счётчик
