{"id":7778,"date":"2022-08-27T12:03:01","date_gmt":"2022-08-27T10:03:01","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=7778"},"modified":"2022-08-27T12:03:01","modified_gmt":"2022-08-27T10:03:01","slug":"pfh-la-semana-en-exercitium-26-de-agosto-de-2022","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/pfh-la-semana-en-exercitium-26-de-agosto-de-2022\/","title":{"rendered":"PFH: La semana en Exercitium (26 de agosto de 2022)"},"content":{"rendered":"<p>Esta semana he publicado en <a href=\"http:\/\/bit.ly\/2sqPtGs\">Exercitium<\/a> las soluciones de los siguientes problemas:<\/p>\n<ul>\n<li><a href=\"#ej1\">1. Interior de una lista<\/a><\/li>\n<li><a href=\"#ej2\">2. Elementos finales<\/a><\/li>\n<li><a href=\"#ej3\">3. Segmento de una lista<\/a><\/li>\n<li><a href=\"#ej4\">4. Primeros y \u00faltimos elementos<\/a><\/li>\n<li><a href=\"#ej5\">5. Elemento mediano<\/a><\/li>\n<\/ul>\n<p>A continuaci\u00f3n se muestran las soluciones.<br \/>\n<!--more--><br \/>\n<a name=\"ej1\"><\/a><\/p>\n<h3>1. Interior de una lista<\/h3>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   interior :: [a] -> [a]\n<\/pre>\n<p>tal que <code>(interior xs)<\/code> es la lista obtenida eliminando los extremos de la lista <code>xs<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   interior [2,5,3,7,3]  ==  [5,3,7]\n   interior [2..7]       ==  [3,4,5,6]\n<\/pre>\n<p><!--more--><\/p>\n<p><b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\ninterior :: [a] -> [a]\ninterior xs = tail (init xs)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Interior_de_una_lista.hs\">GitHub<\/a>.<\/p>\n<p><b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom typing import TypeVar\nfrom hypothesis import given, strategies as st\n\nA = TypeVar('A')\n\n# 1\u00aa soluci\u00f3n\ndef interior1(xs: list[A]) -> list[A]:\n    return xs[1:][:-1]\n\n# 2\u00aa soluci\u00f3n\ndef interior2(xs: list[A]) -> list[A]:\n    return xs[1:-1]\n\n# La propiedad de equivalencia es\n@given(st.lists(st.integers()))\ndef test_triangular(xs):\n    assert interior1(xs) == interior2(xs)\n\n# La comprobaci\u00f3n es\n#    src> poetry run pytest -q interior_de_una_lista.py\n#    1 passed in 0.21s\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium-Python\/blob\/main\/src\/interior_de_una_lista.py\">GitHub<\/a>.<\/p>\n<p><b>Comentarios<\/b><\/p>\n<ul>\n<li>Los elementos iniciales de una lista <code>xs<\/code> se calcula\n<ul>\n<li>en Haskell, con <code>init xs<\/code> y<\/li>\n<li>en Python, con <code>xs[:-1]<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a name=\"ej2\"><\/a><\/p>\n<h3>2. Elementos finales<\/h3>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   finales :: Int -> [a] -> [a]\n<\/pre>\n<p>tal que <code>(finales n xs)<\/code> es la lista formada por los <code>n<\/code> finales elementos de <code>xs<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   finales 3 [2,5,4,7,9,6]  ==  [7,9,6]\n<\/pre>\n<p><!--more--><\/p>\n<p><b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\nimport Test.QuickCheck\n\n-- 1\u00aa definici\u00f3n\nfinales1 :: Int -> [a] -> [a]\nfinales1 n xs = drop (length xs - n) xs\n\n-- 2\u00aa definici\u00f3n\nfinales2 :: Int -> [a] -> [a]\nfinales2 n xs = reverse (take n (reverse xs))\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_finales :: Int -> [Int] -> Bool\nprop_finales n xs =\n  finales1 n xs == finales2 n xs\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_finales\n--    +++ OK, passed 100 tests.\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Elementos_finales.hs\">GitHub<\/a><\/p>\n<p><b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom typing import TypeVar\nfrom hypothesis import given, strategies as st\n\nA = TypeVar('A')\n\n# 1\u00aa definici\u00f3n\ndef finales1(n: int, xs: list[A]) -> list[A]:\n    if len(xs) <= n:\n        return xs\n    return xs[len(xs) - n:]\n\n# 2\u00aa definici\u00f3n\ndef finales2(n: int, xs: list[A]) -> list[A]:\n    if n == 0:\n        return []\n    return xs[-n:]\n\n# 3\u00aa definici\u00f3n\ndef finales3(n: int, xs: list[A]) -> list[A]:\n    ys = list(reversed(xs))\n    return list(reversed(ys[:n]))\n\n# La propiedad de equivalencia es\n@given(st.integers(min_value=0), st.lists(st.integers()))\ndef test_equiv_finales(n, xs):\n    assert finales1(n, xs) == finales2(n, xs) == finales3(n, xs)\n\n# La comprobaci\u00f3n es\n#    src> poetry run pytest -q elementos_finales.py\n#    1 passed in 0.18s\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium-Python\/blob\/main\/src\/elementos_finales.py\">GitHub<\/a><\/p>\n<p><b>Comentarios<\/b><\/p>\n<ul>\n<li>La longitud de la lista <code>xs<\/code> se calcula\n<ul>\n<li>en Haskell, con <code>length xs<\/code> y<\/li>\n<li>en Python, con <code>len(xs)<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a name=\"ej3\"><\/a><\/p>\n<h3>3. Segmento de una lista<\/h3>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   segmento :: Int -> Int -> [a] -> [a]\n<\/pre>\n<p>tal que <code>(segmento m n xs)<\/code> es la lista de los elementos de <code>xs<\/code> comprendidos entre las posiciones <code>m<\/code> y <code>n<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]\n   segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]\n   segmento 5 3 [3,4,1,2,7,9,0]  ==  []\n<\/pre>\n<p><!--more--><\/p>\n<p><b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\nsegmento :: Int -> Int -> [a] -> [a]\nsegmento m n xs = drop (m-1) (take n xs)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Segmento_de_una_lista.hs\">GitHub<\/a>.<\/p>\n<p><b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom typing import TypeVar\nfrom hypothesis import given, strategies as st\n\nA = TypeVar('A')\n\n# 1\u00aa definici\u00f3n\ndef segmento1(m: int, n: int, xs: list[A]) -> list[A]:\n    ys = xs[:n]\n    return ys[m - 1:]\n\n# 2\u00aa definici\u00f3n\ndef segmento2(m: int, n: int, xs: list[A]) -> list[A]:\n    return xs[m-1:n]\n\n# La propiedad de equivalencia es\n@given(st.integers(), st.integers(), st.lists(st.integers()))\ndef test_equiv_segmento(m, n, xs):\n    assert segmento1(m, n, xs) == segmento2(m, n, xs)\n\n# La comprobaci\u00f3n es\n#    src> poetry run pytest -q segmento_de_una_lista.py\n#    1 passed in 0.19s\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium-Python\/blob\/main\/src\/segmento_de_una_lista.py\">GitHub<\/a>.<\/p>\n<p><a name=\"ej4\"><\/a><\/p>\n<h3>4. Primeros y \u00faltimos elementos<\/h3>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   extremos :: Int -> [a] -> [a]\n<\/pre>\n<p>tal que <code>(extremos n xs)<\/code> es la lista formada por los <code>n<\/code> primeros elementos de <code>xs<\/code> y los <code>n<\/code> finales elementos de <code>xs<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   extremos 3 [2,6,7,1,2,4,5,8,9,2,3]  ==  [2,6,7,9,2,3]\n<\/pre>\n<p><!--more--><\/p>\n<p><b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\nextremos :: Int -> [a] -> [a]\nextremos n xs = take n xs ++ drop (length xs - n) xs\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Primeros_y_ultimos_elementos.hs\">GitHub<\/a>.<\/p>\n<p><b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom typing import TypeVar\n\nA = TypeVar('A')\n\ndef extremos(n: int, xs: list[A]) -> list[A]:\n    return xs[:n] + xs[-n:]\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium-Python\/blob\/main\/src\/primeros_y_ultimos_elementos.py\">GitHub<\/a>.<\/p>\n<p><a name=\"ej5\"><\/a><\/p>\n<h3>5. Elemento mediano<\/h3>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   mediano :: Int -> Int -> Int -> Int\n<\/pre>\n<p>tal que <code>(mediano x y z)<\/code> es el n\u00famero mediano de los tres n\u00fameros <code>x<\/code>, <code>y<\/code> y <code>z<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   mediano 3 2 5  ==  3\n   mediano 2 4 5  ==  4\n   mediano 2 6 5  ==  5\n   mediano 2 6 6  ==  6\n<\/pre>\n<p><!--more--><\/p>\n<p><b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\nmediano :: Int -> Int -> Int -> Int\nmediano x y z = x + y + z - minimum [x,y,z] - maximum [x,y,z]\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Elemento_mediano.hs\">GitHub<\/a>.<\/p>\n<p><b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\ndef mediano(x: int, y: int, z: int) -> int:\n    return x + y + z - min([x, y, z]) - max([x, y, z])\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium-Python\/blob\/main\/src\/elemento_mediano.py\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta semana he publicado en Exercitium las soluciones de los siguientes problemas: 1. Interior de una lista 2. Elementos finales 3. Segmento de una lista 4. Primeros y \u00faltimos elementos 5. Elemento mediano A continuaci\u00f3n se muestran las soluciones.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","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":[337],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7778"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=7778"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7778\/revisions"}],"predecessor-version":[{"id":7779,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7778\/revisions\/7779"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=7778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=7778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=7778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}