У меня есть секретный код для взлома детектива! 🕵️♀️
изначально опубликовано на 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. сеть"