Рубрики
Без рубрики

BBK#5: Азбука Морзе 🤫

Не будьте Java-иш-девиной в мире Kotlin, улучшите свои знания о Kotlin Standard Library a… С тегами kotlin, android, программирование, java.

Не будьте Java-иш-девиной в мире Kotlin, улучшайте свои знания о стандартной библиотеке Kotlin и пишите лучший код Kotlin. Знак победы Если ваш Java-разработчик мигрирует на Kotlin, это поможет вам многому научиться!

У меня есть секретный код для вас, чтобы взломать детектив! 🕵 Женский знак ️

первоначально опубликовано на https://chetangupta.net/bbk-main/

Этот тест был предложен Роханом Сингхом в Твиттере, извините за задержку, приятель!

Вопрос: Вы получили секретное сообщение! к сожалению, вы не можете просто прочитать его, он закодирован азбукой Морзе. Ваша задача – реализовать функцию, которая принимала бы азбуку Морзе в качестве входных данных и возвращала удобочитаемую строку. 3 пробела используются для разделения слов и Дополнительные пробелы до или после кода не имеют никакого значения и должны игнорироваться.

Message : -. - - - ..- …. .- …- . .- -… .. - . -… .-. .- .. -. ..-. - - .-. -.- - - - .-.. .. -.
val morseCode = "-.-- --- ..-   .... .- ...- .   .-   -... .. --.   -... .-. .- .. -.   ..-. --- .-.   -.- --- - .-.. .. -."  
// write a function that converts this MorseCode to English fun decodeMorse(morseCode:String):String{   
 // .. do stuff 
}

Данный Декодер азбуки Морзе

val morseDecoder = mapOf(
        ".-" to "A",
        "-..." to "B",
        "-.-." to "C",
        "-.." to "D",
        "." to "E",
        "..-." to "F",
        "--." to "G",
        "...." to "H",
        ".." to "I",
        ".---" to "J",
        "-.-" to "K",
        ".-.." to "L",
        "--" to "M",
        "-." to "N",
        "---" to "O",
        ".--." to "P",
        "--.-" to "Q",
        ".-." to "R",
        "..." to "S",
        "-" to "T",
        "..-" to "U",
        "...-" to "V",
        ".--" to "W",
        "-..-" to "X",
        "-.--" to "Y",
        "--.." to "Z",
        ".----" to "1",
        "..---" to "2",
        "...--" to "3",
        "....-" to "4",
        "....." to "5",
        "-...." to "6",
        "--..." to "7",
        "---.." to "8",
        "----." to "9",
        "-----" to "0",
        "" to " ",
        ".-.-.-" to ".",
        "--..--" to ",",
        "---..." to ".",
        "..--.." to "?",
        "-.-.--" to "!",
        "...---..." to "SOS",
        "-....-" to "''",
        "-..-." to "/",
        "-.--.-" to "()",
        ".--.-." to "@",
        "-...-" to )

Попробуйте сами: 👨🏻 💻 👉 Попробуйте Сами

Тот же старый императивный способ. 😪

fun decodeMorse(code: String): String {
    val morseWords = code.split("   ")
    val humanized = StringBuilder()
    for (morseWord in morseWords) {
        val morseChars = morseWord.split(" ")
        for (morseChar in morseChars) {
            if (morseChar.isNotEmpty()) {
                humanized.append(morseDecoder.get(morseChar))
            }
        }
        humanized.append(" ")
    }
    return humanized.toString()
}
// 👨🏻‍🔧 complexity : O(n^2)
// ⏱ performance : took 509.0 us on my machine

Кстати, в этом нет ничего плохого, просто циклы делают его очень выразительным, в нем нет проблем с мутациями и случайными обновлениями. 🙌 🏻

Проверьте, почему шаблон аккумулятора в императивном стиле плох. 💡

Императивный эквивалентный код в функциональном стиле | Функция Stdlib

fun decodeMorse(code: String): String {
    return code.trim()
        .split("   ")
        .joinToString(separator = " ") { word ->
            word.split(" ")
                    .map { letter -> morseDecoder[letter] ?: "" }
                    .joinToString(separator = "")
        }
}
// 👨🏻‍🔧 complexity : O(n^2)
// ⏱ performance : took 639.0 us on my machine

Снижение производительности происходит из-за операции joinToString, выполняемой один раз во внешнем цикле и несколько раз во внутреннем цикле, что не очень хорошо! дуд (чувак)… Хмурое лицо

изучите joinToString и это продвинутые варианты использования 💡

Что, если мы назовем это один раз? , если мы исключим вложенность, то есть сведем наши слова к символу?

👨🏻 💻 Давайте выровняем наш список с помощью flatMap

Плоская карта

fun decodeMorse(code: String) = code
        .split("  ")
        .flatMap { it.split(" ") }
        .map {morseDecoder.get(it)?:"" }
        .joinToString("")

// 👨🏻‍🔧 complexity : O(n)
// ⏱ performance : took 464.0 us us on my machine
Whola!

Или измените способ решения этой проблемы 💁 ♀ ️

fun decodeMorse(code: String): String {
    return code.trim()
        .replace("  ", " ")
        .split(" ")
        .map { morseDecoder[it]?:"" }
        .joinToString(" ")
}
// 👨🏻‍🔧 complexity : O(n)
// ⏱ performance : took 441.0 us on my machine

Не привязывайтесь к решению!

Цель этих статей не в том, чтобы сосредоточиться на Java, а в том, чтобы помочь людям изучить различные способы, с помощью которых они могут писать ту же логику лучше и более ориентированным на стандартную библиотеку Kotlin способом. Надеюсь, вы найдете это информативным, и если у вас есть какие-либо отзывы или запросы на публикацию или вы хотите подписаться на мой список рассылки, формы приведены ниже.

До следующего раза. Счастливого Взлома! 👩 Персональный компьютер

Решите еще много проблем 👇🏻

Оригинал: “https://dev.to/ch8n/bbk-6-the-morse-code-4ppn”