Преобразование строки


#1

Ребята, Всем привет !

Есть задача, преобразовать формат строки из 1XXXX-2YYYY-3ZZZZ в 1xxxx2yyyy3zzzz, может кто подсказать, как это можно реализовать ?

Разбить переменную, в которой хранится 1XXXX-2YYYY-3ZZZZ на символы и выполнить их замену, а “-” вообще убрать или как ?

Спасибо !


#2

string.replacingOccurrences(of: "-", with: "").lowercased()


#3

Похоже на задачку из CodeWars.com :slight_smile:


#4

Нельзя такие ссылки давать во время рабочего дня…


#5

Недавно, кстати, наткнулся там на похожую:

Написать тело функции:
accum(“abcd”) -> “A-Bb-Ccc-Dddd”
accum(“RqaEzty”) -> “R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy”
accum(“cwAt”) -> “C-Ww-Aaa-Tttt”

Как бы решили?


#6
func accum(str: String) -> String {
    var stringArr: [String] = []
    for (i, l) in str.lowercased().enumerated() {
        let s = String(repeating: l, count: i + 1)
        stringArr.append(s.capitalized)
    }

    return stringArr.joined(separator: "-")
}

Или еще короче

func accum(str: String) -> String {
    return str.lowercased()
                  .enumerated()
                  .map {
                      String(repeating: $0.element, count: $0.offset + 1).capitalized
                  }
                  .joined(separator: "-")
}

#7

Я такую задачку в питоне решал. Для свифта оформлял только условие и тесты. )


#8
func accum(str: String) -> String {
    return str.reduce(into: [String]()) { $0.append(String(repeating: $1, count: $0.count + 1).capitalized) }.joined(separator: "-")
}
func accum(str: String) -> String {
    return str.enumerated().reduce(into: "") { $0 += ($0.isEmpty ? "" : "-") + String(repeating: $1.element, count: $1.offset + 1).capitalized }
}

#9

Rex, очередной огромный респектуля !
Подскажи, откуда можно узнавать о таких готовых функциях ?

Совсем недавно я знаком с программированием… Так скажем лет 10 назад я конечно что-то писал в универе, но то был паскаль, и вот так двумя словами там не решались вопросы переворачивания строк…

Хотелось бы познать дзен…

Спасибо !


#10

Google, StackOverflow
Я сам не знаю всех возможностей свифта, практически кажую неделю что-то нахожу готовое из коробки.
На крайний случай @haymob всегда подскажет что-то из встроенного функционала :slight_smile:
К примеру его способ с reduce. Я этой функцией еще не пользовался, поэтому и не привел пример с ней.


#11

Моя реализация была очень похожа на ответ RexHunt’a. К сожалению, я пока не изучал оценку алгоритмов, так что не знаю: метод с reduce он лучше (память/время) или это просто “стилистические предпочтения”?

Вообще, было бы интересно, наверно, раз в неделю давать задачку для форумчан и делится решениями. Это могло бы поспособствовать общему повышению уровня.


#12

Для начала определи с каким объемом данных ты будешь работать. В некоторых случаях нет смысла оценивать эффективность алгоритмов.


#13

Тогда оцените ленивые коллекции. Вместе с map, reduce и другими траверс-функциями Вы получите гораздо лучшую производительность.

Для доступа к ленивому варианту коллекции используйте свойство lazy коллекции.