{"id":462,"date":"2014-07-10T07:00:34","date_gmt":"2014-07-10T05:00:34","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=462"},"modified":"2014-12-27T21:44:21","modified_gmt":"2014-12-27T19:44:21","slug":"codigo-morse","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/codigo-morse\/","title":{"rendered":"C\u00f3digo Morse"},"content":{"rendered":"<p>El <a href=\"http:\/\/bit.ly\/1neNnh9\">c\u00f3digo Morse<\/a> es un sistema de representaci\u00f3n de letras y n\u00fameros mediante se\u00f1ales emitidas de forma intermitente.<\/p>\n<p>A los signos (letras may\u00fasculas o d\u00edgitos) se le asigna un c\u00f3digo como se muestra a continuaci\u00f3n<\/p>\n<pre lang=\"text\">\n    +---+-------+---+-------+---+-------+---+-------+\n    | A | .-    | J | .---  | S | ...   | 1 | ..--- |\n    | B | -...  | K | -.-   | T | -     | 2 | ...-- |\n    | C | -.-.  | L | .-..  | U | ..-   | 3 | ....- |\n    | D | -..   | M | --    | V | ...-  | 4 | ..... |\n    | E | .     | N | -.    | W | .--   | 5 | -.... |\n    | F | ..-.  | O | ---   | X | -..-  | 6 | --... |\n    | G | --.   | P | .--.  | Y | -.--  | 7 | ---.. |\n    | H | ....  | Q | --.-  | Z | --..  | 8 | ----. |\n    | I | ..    | R | .-.   | 0 | .---- | 9 | ----- |\n    +---+-------+---+-------+---+-------+---+-------+\n<\/pre>\n<p>El c\u00f3digo Morse de las palabras se obtiene a partir del de sus caracteres insertando un espacio entre cada uno. Por ejemplo, el c\u00f3digo de <code>\"todo\"<\/code> es <code>\"- --- -.. ---\"<\/code><\/p>\n<p>El c\u00f3digo Morse de las frases se obtiene a partir del de sus palabras insertando dos espacios entre cada uno. Por ejemplo, el c\u00f3digo de <code>\"todo o nada\"<\/code> es <code>\"- --- -.. ---  ---  -. .- -.. .-\"<\/code><\/p>\n<h3>Enunciado<\/h3>\n<pre lang=\"text\">\n-- Definir las funciones\n--    fraseAmorse :: String -> String\n--    morseAfrase :: String -> String\n-- tales que\n-- * (fraseAmorse cs) es la traducci\u00f3n de la frase cs a Morse. Por\n--   ejemplo, \n--      ghci> fraseAmorse \"En todo la medida\"\n--      \". -.  - --- -.. ---  .-.. .-  -- . -.. .. -.. .-\"\n-- * (morseAfrase cs) es la frase cuya traducci\u00f3n a Morse es cs. Por \n--   ejemplo, \n--      ghci> morseAfrase \". -.  - --- -.. ---  .-.. .-  -- . -.. .. -.. .-\"\n--      \"EN TODO LA MEDIDA\"\n--\n-- Nota: La lista de los c\u00f3digos Morse de A, B, ..., Z, 0, 1, ..., 9 es\n--    [\".-\",\"-...\",\"-.-.\",\"-..\",\".\",\"..-.\",\"--.\",\"....\",\"..\",\".---\",\n--     \"-.-\",\".-..\",\"--\",\"-.\",\"---\",\".--.\",\"--.-\",\".-.\",\"...\",\"-\",\n--     \"..-\",\"...-\",\".--\",\"-..-\",\"-.--\",\"--..\",\".----\",\"..---\",\"...--\",\n--     \"....-\",\".....\",\"-....\",\"--...\",\"---..\",\"----.\",\"-----\"]\n<\/pre>\n<p><strong>Ayuda<\/strong>: Se puede usar la funci\u00f3n <code>splitOn<\/code> de la librer\u00eda <a href=\"http:\/\/bit.ly\/1mjFua3\">Data.List.Split<\/a>.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Char (toUpper)\nimport Data.List (intercalate)\nimport Data.List.Split (splitOn)\n\n-- caracteres es la lista ordenada de las caracteres (letras may\u00fasculas\n-- y d\u00edgitos) que se usan en los mensajes Morse.\ncaracteres :: [Char]\ncaracteres = ['A'..'Z'] ++ ['0'..'9']\n\n-- morse es la lista de los c\u00f3digos Morse correspondientes a la lista\n-- de caracteres.\nmorse :: [String]\nmorse = [\".-\",\"-...\",\"-.-.\",\"-..\",\".\",\"..-.\",\"--.\",\"....\",\"..\",\".---\",\n         \"-.-\",\".-..\",\"--\",\"-.\",\"---\",\".--.\",\"--.-\",\".-.\",\"...\",\"-\",\n         \"..-\",\"...-\",\".--\",\"-..-\",\"-.--\",\"--..\",\".----\",\"..---\",\"...--\",\n         \"....-\",\".....\",\"-....\",\"--...\",\"---..\",\"----.\",\"-----\"]\n\n-- (correspondiente xs ys x) es el elemento de ys en la misma posici\u00f3n\n-- que x en xs. Por ejemplo,\n--    correspondiente [1..10] [2,4..20] 3  ==  6\ncorrespondiente :: Ord a => [a] -> [b] -> a -> b\ncorrespondiente xs ys x = head [y | (z,y) <- zip xs ys, z == x]\n\n-- (caracterAmorse x) es el c\u00f3digo Morse correspondiente al car\u00e1cter\n-- x. Por ejemplo, \n--    caracterAmorse 'A'  ==  \".-\"\n--    caracterAmorse 'B'  ==  \"-...\"\n--    caracterAmorse '1'  ==  \"..---\"\n--    caracterAmorse 'a'  ==  \".-\"\ncaracterAmorse :: Char -> String\ncaracterAmorse = correspondiente caracteres morse . toUpper\n\n-- (morseAcaracter x) es el car\u00e1cter cuyo c\u00f3digo Morse es x. Por\n-- ejemplo,  \n--    morseAcaracter \".-\"     ==  'A'\n--    morseAcaracter \"-...\"   ==  'B'\n--    morseAcaracter \"..---\"  ==  '1'\nmorseAcaracter :: String -> Char\nmorseAcaracter = correspondiente morse caracteres\n\n-- (palabraAmorse cs) es el c\u00f3digo Morse correspondiente a la palabra\n-- cs. Por ejemplo,\n--    palabraAmorse \"En\"  ==  \". -.\"\npalabraAmorse :: [Char] -> String\npalabraAmorse = unwords . map caracterAmorse\n\n-- (morseApalabra cs) es la palabra cuyo traducci\u00f3n a Morse es cs. Por\n-- ejemplo, \n--    morseApalabra \". -.\"  ==  \"EN\"\nmorseApalabra :: String -> [Char]\nmorseApalabra = map morseAcaracter . words\n\n-- (fraseAmorse cs) es la traducci\u00f3n de la frase cs a Morse. Por ejemplo,\n--    ghci> fraseAmorse \"En todo la medida\"\n--    \". -.  - --- -.. ---  .-.. .-  -- . -.. .. -.. .-\"\nfraseAmorse :: String -> String\nfraseAmorse = intercalate \"  \" . map palabraAmorse . words\n\n-- Ejemplo de c\u00e1lculo\n--    fraseAmorse \"En todo la medida\"\n--    = (intercalate \"  \" . map palabraAmorse . words)\n--      \"En todo la medida\"\n--    = (intercalate \"  \" . map palabraAmorse)\n--      [\"En\",\"todo\",\"la\",\"medida\"]\n--    = intercalate \"  \" [\". -.\",\"- --- -.. ---\",\".-.. .-\",\"-- . -.. .. -.. .-\"]\n--    = \". -.  - --- -.. ---  .-.. .-  -- . -.. .. -.. .-\"\n  \n-- (morseAfrase cs) es la frase cuya traducci\u00f3n a Morse es cs. Por\n-- ejemplo, \n--    ghci> morseAfrase \". -.  - --- -.. ---  .-.. .-  -- . -.. .. -.. .-\"\n--    \"EN TODO LA MEDIDA\"\nmorseAfrase :: String -> String\nmorseAfrase = unwords . map morseApalabra . splitOn \"  \"\n\n-- Ejemplo de c\u00e1lculo\n--    morseAfrase \". -.  - --- -.. ---  .-.. .-  -- . -.. .. -.. .-\"\n--    = (unwords . map morseApalabra)\n--      \". -.  - --- -.. ---  .-.. .-  -- . -.. .. -.. .-\"\n--    = (unwords . map morseApalabra)\n--      [\". -.\",\"- --- -.. ---\",\".-.. .-\",\"-- . -.. .. -.. .-\"]\n--    = unwords [\"EN\",\"TODO\",\"LA\",\"MEDIDA\"]\n--    = \"EN TODO LA MEDIDA\"\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>El c\u00f3digo Morse es un sistema de representaci\u00f3n de letras y n\u00fameros mediante se\u00f1ales emitidas de forma intermitente. A los signos (letras may\u00fasculas o d\u00edgitos) se le asigna un c\u00f3digo como se muestra a continuaci\u00f3n +&#8212;+&#8212;&#8212;-+&#8212;+&#8212;&#8212;-+&#8212;+&#8212;&#8212;-+&#8212;+&#8212;&#8212;-+ | A | .- | J | .&#8212; | S | &#8230; | 1 | ..&#8212; | | B&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[7],"tags":[35,8,71,139,10,11,140,137,138,132,9],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/462"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=462"}],"version-history":[{"count":15,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/462\/revisions"}],"predecessor-version":[{"id":666,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/462\/revisions\/666"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}