{"id":7509,"date":"2022-11-10T09:31:56","date_gmt":"2022-11-10T07:31:56","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7509"},"modified":"2022-12-14T11:46:49","modified_gmt":"2022-12-14T09:46:49","slug":"10-nov-22","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/10-nov-22\/","title":{"rendered":"May\u00fasculas iniciales"},"content":{"rendered":"<p>Se consideran las siguientes reglas de may\u00fasculas iniciales para los t\u00edtulos:<\/p>\n<ul>\n<li>la primera palabra comienza en may\u00fascula y<\/li>\n<li>todas las palabras que tienen 4 letras como m\u00ednimo empiezan con may\u00fasculas<\/li>\n<\/ul>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   titulo :: [String] -> [String]\n<\/pre>\n<p>tal que <code>titulo ps<\/code> es la lista de las palabras de <code>ps<\/code> con las reglas de may\u00fasculas iniciales de los t\u00edtulos. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> titulo [\"eL\",\"arTE\",\"DE\",\"La\",\"proGraMacion\"]\n   [\"El\",\"Arte\",\"de\",\"la\",\"Programacion\"]\n<\/pre>\n<p><b>Soluciones<\/b><\/p>\n<p>A continuaci\u00f3n se muestran las <a href=\"#haskell\">soluciones en Haskell<\/a> y las <a href=\"#python\">soluciones en Python<\/a>.<\/p>\n<p><a name=\"haskell\"><\/a><br \/>\n<b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\nimport Data.Char (toUpper, toLower)\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\ntitulo1 :: [String] -> [String]\ntitulo1 []     = []\ntitulo1 (p:ps) = mayusculaInicial p : [transforma q | q <- ps]\n\n-- (mayusculaInicial xs) es la palabra xs con la letra inicial\n-- en may\u00fascula y las restantes en min\u00fasculas. Por ejemplo,\n--    mayusculaInicial \"sEviLLa\"  ==  \"Sevilla\"\nmayusculaInicial :: String -> String\nmayusculaInicial []     = []\nmayusculaInicial (x:xs) = toUpper x : [toLower y | y <- xs]\n\n-- (transforma p) es la palabra p con may\u00fascula inicial si su longitud\n-- es mayor o igual que 4 y es p en min\u00fascula en caso contrario\ntransforma :: String -> String\ntransforma p | length p >= 4 = mayusculaInicial p\n             | otherwise     = minuscula p\n\n-- (minuscula xs) es la palabra xs en min\u00fascula.\nminuscula :: String -> String\nminuscula xs = [toLower x | x <- xs]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\ntitulo2 :: [String] -> [String]\ntitulo2 []     = []\ntitulo2 (p:ps) = mayusculaInicial p : aux ps\n  where aux []     = []\n        aux (q:qs) = transforma q : aux qs\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\ntitulo3 :: [String] -> [String]\ntitulo3 []     = []\ntitulo3 (p:ps) = mayusculaInicial p : map transforma ps\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_titulo :: [String] -> Bool\nprop_titulo xs =\n  all (== titulo1 xs)\n      [titulo2 xs,\n       titulo3 xs]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_titulo\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> length (titulo1 (take (10^7) (cycle [\"hOy\",\"Es\",\"juEves\",\"dE\",\"Noviembre\"])))\n--    10000000\n--    (2.17 secs, 1,680,592,512 bytes)\n--    \u03bb> length (titulo2 (take (10^7) (cycle [\"hOy\",\"Es\",\"juEves\",\"dE\",\"Noviembre\"])))\n--    10000000\n--    (2.45 secs, 2,240,592,464 bytes)\n--    \u03bb> length (titulo3 (take (10^7) (cycle [\"hOy\",\"Es\",\"juEves\",\"dE\",\"Noviembre\"])))\n--    10000000\n--    (0.16 secs, 1,440,592,464 bytes)\n<\/pre>\n<p><a name=\"python\"><\/a><br \/>\n<b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom sys import setrecursionlimit\nfrom timeit import Timer, default_timer\n\nfrom hypothesis import given\nfrom hypothesis import strategies as st\n\nsetrecursionlimit(10**6)\n\n# 1\u00aa soluci\u00f3n\n# ===========\n\n# (mayusculaInicial xs) es la palabra xs con la letra inicial\n# en may\u00fascula y las restantes en min\u00fasculas. Por ejemplo,\n#    mayusculaInicial(\"sEviLLa\")  ==  \"Sevilla\"\ndef mayusculaInicial(xs: str) -> str:\n    return xs.capitalize()\n\n# (minuscula xs) es la palabra xs en min\u00fascula.\ndef minuscula(xs: str) -> str:\n    return xs.lower()\n\n# (transforma p) es la palabra p con may\u00fascula inicial si su longitud\n# es mayor o igual que 4 y es p en min\u00fascula en caso contrario\ndef transforma(p: str) -> str:\n    if len(p) >= 4:\n        return mayusculaInicial(p)\n    return minuscula(p)\n\ndef titulo1(ps: list[str]) -> list[str]:\n    if ps:\n        return [mayusculaInicial(ps[0])] + [transforma(q) for q in ps[1:]]\n    return []\n\n# 2\u00aa soluci\u00f3n\n# ===========\n\ndef titulo2(ps: list[str]) -> list[str]:\n    def aux(qs: list[str]) -> list[str]:\n        if qs:\n            return [transforma(qs[0])] + aux(qs[1:])\n        return []\n    if ps:\n        return [mayusculaInicial(ps[0])] + aux(ps[1:])\n    return []\n\n# 3\u00aa soluci\u00f3n\n# ===========\n\ndef titulo3(ps: list[str]) -> list[str]:\n    if ps:\n        return [mayusculaInicial(ps[0])] + list(map(transforma, ps[1:]))\n    return []\n\n# Comprobaci\u00f3n de equivalencia\n# ============================\n\n# La propiedad es\n@given(st.lists(st.text()))\ndef test_titulo(ps: list[str]) -> None:\n    r = titulo1(ps)\n    assert titulo2(ps) == r\n    assert titulo3(ps) == r\n\n# La comprobaci\u00f3n es\n#    src> poetry run pytest -q mayusculas_iniciales.py\n#    1 passed in 0.55s\n\n# Comparaci\u00f3n de eficiencia\n# =========================\n\ndef tiempo(e: str) -> None:\n    \"\"\"Tiempo (en segundos) de evaluar la expresi\u00f3n e.\"\"\"\n    t = Timer(e, \"\", default_timer, globals()).timeit(1)\n    print(f\"{t:0.2f} segundos\")\n\n# La comparaci\u00f3n es\n#    >>> tiempo('len(mayusculaInicial1(\"aB\"*(10**7)))')\n#    >>> tiempo('titulo1([\"eL\",\"arTE\",\"DE\",\"La\",\"proGraMacion \"]*1900)')\n#    0.00 segundos\n#    >>> tiempo('titulo2([\"eL\",\"arTE\",\"DE\",\"La\",\"proGraMacion \"]*1900)')\n#    0.30 segundos\n#    >>> tiempo('titulo3([\"eL\",\"arTE\",\"DE\",\"La\",\"proGraMacion \"]*1900)')\n#    0.00 segundos\n#\n#    >>> tiempo('titulo1([\"eL\",\"arTE\",\"DE\",\"La\",\"proGraMacion \"]*(2*10**6))')\n#    2.93 segundos\n#    >>> tiempo('titulo3([\"eL\",\"arTE\",\"DE\",\"La\",\"proGraMacion \"]*(2*10**6))')\n#    2.35 segundos\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Se consideran las siguientes reglas de may\u00fasculas iniciales para los t\u00edtulos: la primera palabra comienza en may\u00fascula y todas las palabras que tienen 4 letras como m\u00ednimo empiezan con may\u00fasculas Definir la funci\u00f3n titulo :: [String] -> [String] tal que titulo ps es la lista de las palabras de ps con las reglas de may\u00fasculas&#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":[581],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7509"}],"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=7509"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7509\/revisions"}],"predecessor-version":[{"id":7651,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7509\/revisions\/7651"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}