У меня есть секретный код для взлома детектива! 🕵️‍♀️

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

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

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

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

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

Сообщение : -. - - - ..-…. .-… -. .- -… .. -. -… .-. .- .. -. ..-. - - .-. -.- - - - .- .. .. -.

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

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

val morseDecoder = mapOf<String, String>(
        ".-" 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 "="
)

Попробуйте поставить сами:
👨🏻‍💻👉 https://www.codewars.com/kata/54b724efac3d5402db00065e/train/kotlin

Решение 1:

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

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

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

Ознакомьтесь с тем, почему плохой узор аккумулятора в императивном стиле.



Решение 2:

Императивный эквивалентный код в функциональном стиле | Функция 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 операции: одна во внешнем цикле и несколько раз во внутреннем цикле, не очень хорошо! dood (чувак) ... ☹️

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



Решение 3:

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

👨🏻‍💻 Давайте сгладим наш List с помощью 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!

Решение 4:

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

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

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

Вывод

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

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

До скорого. Удачного взлома! 👩‍💻

Решите еще много 👇🏻



«Big-Brain-Kotlin
Не будьте Java-разработчиком в мире Kotlin, улучшите свои знания о стандартной библиотеке Koltin и лучше пишите ... chetangupta. сеть"