Código Morse
El código Morse es un sistema de representación de letras y números mediante señales emitidas de forma intermitente.
A los signos (letras mayúsculas o dígitos) se le asigna un código como se muestra a continuación
1 2 3 4 5 6 7 8 9 10 11 |
+---+-------+---+-------+---+-------+---+-------+ | A | .- | J | .--- | S | ... | 1 | ..--- | | B | -... | K | -.- | T | - | 2 | ...-- | | C | -.-. | L | .-.. | U | ..- | 3 | ....- | | D | -.. | M | -- | V | ...- | 4 | ..... | | E | . | N | -. | W | .-- | 5 | -.... | | F | ..-. | O | --- | X | -..- | 6 | --... | | G | --. | P | .--. | Y | -.-- | 7 | ---.. | | H | .... | Q | --.- | Z | --.. | 8 | ----. | | I | .. | R | .-. | 0 | .---- | 9 | ----- | +---+-------+---+-------+---+-------+---+-------+ |
El código Morse de las palabras se obtiene a partir del de sus caracteres insertando un espacio entre cada uno. Por ejemplo, el código de "todo"
es "- --- -.. ---"
El código Morse de las frases se obtiene a partir del de sus palabras insertando dos espacios entre cada uno. Por ejemplo, el código de "todo o nada"
es "- --- -.. --- --- -. .- -.. .-"
Enunciado
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-- Definir las funciones -- fraseAmorse :: String -> String -- morseAfrase :: String -> String -- tales que -- * (fraseAmorse cs) es la traducción de la frase cs a Morse. Por -- ejemplo, -- ghci> fraseAmorse "En todo la medida" -- ". -. - --- -.. --- .-.. .- -- . -.. .. -.. .-" -- * (morseAfrase cs) es la frase cuya traducción a Morse es cs. Por -- ejemplo, -- ghci> morseAfrase ". -. - --- -.. --- .-.. .- -- . -.. .. -.. .-" -- "EN TODO LA MEDIDA" -- -- Nota: La lista de los códigos Morse de A, B, ..., Z, 0, 1, ..., 9 es -- [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---", -- "-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-", -- "..-","...-",".--","-..-","-.--","--..",".----","..---","...--", -- "....-",".....","-....","--...","---..","----.","-----"] |
Ayuda: Se puede usar la función splitOn
de la librería Data.List.Split.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
import Data.Char (toUpper) import Data.List (intercalate) import Data.List.Split (splitOn) -- caracteres es la lista ordenada de las caracteres (letras mayúsculas -- y dígitos) que se usan en los mensajes Morse. caracteres :: [Char] caracteres = ['A'..'Z'] ++ ['0'..'9'] -- morse es la lista de los códigos Morse correspondientes a la lista -- de caracteres. morse :: [String] morse = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---", "-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-", "..-","...-",".--","-..-","-.--","--..",".----","..---","...--", "....-",".....","-....","--...","---..","----.","-----"] -- (correspondiente xs ys x) es el elemento de ys en la misma posición -- que x en xs. Por ejemplo, -- correspondiente [1..10] [2,4..20] 3 == 6 correspondiente :: Ord a => [a] -> [b] -> a -> b correspondiente xs ys x = head [y | (z,y) <- zip xs ys, z == x] -- (caracterAmorse x) es el código Morse correspondiente al carácter -- x. Por ejemplo, -- caracterAmorse 'A' == ".-" -- caracterAmorse 'B' == "-..." -- caracterAmorse '1' == "..---" -- caracterAmorse 'a' == ".-" caracterAmorse :: Char -> String caracterAmorse = correspondiente caracteres morse . toUpper -- (morseAcaracter x) es el carácter cuyo código Morse es x. Por -- ejemplo, -- morseAcaracter ".-" == 'A' -- morseAcaracter "-..." == 'B' -- morseAcaracter "..---" == '1' morseAcaracter :: String -> Char morseAcaracter = correspondiente morse caracteres -- (palabraAmorse cs) es el código Morse correspondiente a la palabra -- cs. Por ejemplo, -- palabraAmorse "En" == ". -." palabraAmorse :: [Char] -> String palabraAmorse = unwords . map caracterAmorse -- (morseApalabra cs) es la palabra cuyo traducción a Morse es cs. Por -- ejemplo, -- morseApalabra ". -." == "EN" morseApalabra :: String -> [Char] morseApalabra = map morseAcaracter . words -- (fraseAmorse cs) es la traducción de la frase cs a Morse. Por ejemplo, -- ghci> fraseAmorse "En todo la medida" -- ". -. - --- -.. --- .-.. .- -- . -.. .. -.. .-" fraseAmorse :: String -> String fraseAmorse = intercalate " " . map palabraAmorse . words -- Ejemplo de cálculo -- fraseAmorse "En todo la medida" -- = (intercalate " " . map palabraAmorse . words) -- "En todo la medida" -- = (intercalate " " . map palabraAmorse) -- ["En","todo","la","medida"] -- = intercalate " " [". -.","- --- -.. ---",".-.. .-","-- . -.. .. -.. .-"] -- = ". -. - --- -.. --- .-.. .- -- . -.. .. -.. .-" -- (morseAfrase cs) es la frase cuya traducción a Morse es cs. Por -- ejemplo, -- ghci> morseAfrase ". -. - --- -.. --- .-.. .- -- . -.. .. -.. .-" -- "EN TODO LA MEDIDA" morseAfrase :: String -> String morseAfrase = unwords . map morseApalabra . splitOn " " -- Ejemplo de cálculo -- morseAfrase ". -. - --- -.. --- .-.. .- -- . -.. .. -.. .-" -- = (unwords . map morseApalabra) -- ". -. - --- -.. --- .-.. .- -- . -.. .. -.. .-" -- = (unwords . map morseApalabra) -- [". -.","- --- -.. ---",".-.. .-","-- . -.. .. -.. .-"] -- = unwords ["EN","TODO","LA","MEDIDA"] -- = "EN TODO LA MEDIDA" |