Не будьте 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”