{"id":6930,"date":"2022-04-15T07:00:15","date_gmt":"2022-04-15T05:00:15","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6930"},"modified":"2022-04-30T16:23:30","modified_gmt":"2022-04-30T14:23:30","slug":"separacion-por-posicion","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/separacion-por-posicion\/","title":{"rendered":"Separaci\u00f3n por posici\u00f3n"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   particion :: [a] -> ([a],[a])\n<\/pre>\n<p>tal que <code>(particion xs)<\/code> es el par cuya primera componente son los elementos de <code>xs<\/code> en posiciones pares y su segunda componente son los restantes elementos. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   particion [3,5,6,2]    ==  ([3,6],[5,2])\n   particion [3,5,6,2,7]  ==  ([3,6,7],[5,2])\n   particion \"particion\"  ==  (\"priin\",\"atco\")\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nmodule Separacion_por_posicion where\n\nimport Data.List (partition)\nimport qualified Data.Vector as V ((!), fromList, length)\nimport Test.QuickCheck (quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nparticion1 :: [a] -> ([a],[a])\nparticion1 xs = ([x | (n,x) <- nxs, even n],\n                 [x | (n,x) <- nxs, odd n])\n  where nxs = enumeracion xs\n\n--(numeracion xs) es la enumeraci\u00f3n de xs. Por ejemplo,\n--    enumeracion [7,9,6,8]  ==  [(0,7),(1,9),(2,6),(3,8)]\nenumeracion :: [a] -> [(Int,a)]\nenumeracion = zip [0..]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nparticion2 :: [a] -> ([a],[a])\nparticion2 []     = ([],[])\nparticion2 (x:xs) = (x:zs,ys)\n  where (ys,zs) = particion2 xs\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nparticion3 :: [a] -> ([a],[a])\nparticion3 = foldr f ([],[])\n  where f x (ys,zs) = (x:zs,ys)\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nparticion4 :: [a] -> ([a],[a])\nparticion4 = foldr (\\x (ys,zs) -> (x:zs,ys)) ([],[])\n\n-- 5\u00aa soluci\u00f3n\n-- ===========\n\nparticion5 :: [a] -> ([a],[a])\nparticion5 xs =\n  ([xs!!k | k <- [0,2..n]],\n   [xs!!k | k <- [1,3..n]])\n  where n = length xs - 1\n\n-- 6\u00aa soluci\u00f3n\n-- ===========\n\nparticion6 :: [a] -> ([a],[a])\nparticion6 xs = (pares xs, impares xs)\n\n-- (pares xs) es la lista de los elementos de xs en posiciones\n-- pares. Por ejemplo,\n--    pares [3,5,6,2]  ==  [3,6]\npares :: [a] -> [a]\npares []     = []\npares (x:xs) = x : impares xs\n\n-- (impares xs) es la lista de los elementos de xs en posiciones\n-- impares. Por ejemplo,\n--    impares [3,5,6,2]  ==  [5,2]\nimpares :: [a] -> [a]\nimpares []     = []\nimpares (_:xs) = pares xs\n\n-- 7\u00aa soluci\u00f3n\n-- ===========\n\nparticion7 :: [a] -> ([a],[a])\nparticion7 [] = ([],[])\nparticion7 xs =\n  ([v V.! k | k <- [0,2..n-1]],\n   [v V.! k | k <- [1,3..n-1]])\n  where v = V.fromList xs\n        n = V.length v\n\n-- 8\u00aa soluci\u00f3n\n-- ===========\n\nparticion8 :: [a] -> ([a],[a])\nparticion8 xs =\n  (map snd ys, map snd zs)\n  where (ys,zs) = partition posicionPar (zip [0..] xs)\n\nposicionPar :: (Int,a) -> Bool\nposicionPar = even . fst\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_particion :: [Int] -> Bool\nprop_particion xs =\n  all (== particion1 xs)\n      [particion2 xs,\n       particion3 xs,\n       particion4 xs,\n       particion5 xs,\n       particion6 xs,\n       particion7 xs,\n       particion8 xs]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_particion\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> last (snd (particion1 [1..6*10^6]))\n--    6000000\n--    (2.74 secs, 2,184,516,080 bytes)\n--    \u03bb> last (snd (particion2 [1..6*10^6]))\n--    6000000\n--    (2.02 secs, 1,992,515,880 bytes)\n--    \u03bb> last (snd (particion3 [1..6*10^6]))\n--    6000000\n--    (3.17 secs, 1,767,423,240 bytes)\n--    \u03bb> last (snd (particion4 [1..6*10^6]))\n--    6000000\n--    (3.23 secs, 1,767,423,240 bytes)\n--    \u03bb> last (snd (particion5 [1..6*10^6]))\n--    6000000\n--    (1.62 secs, 1,032,516,192 bytes)\n--    \u03bb> last (snd (particion5 [1..6*10^6]))\n--    6000000\n--    (1.33 secs, 1,032,516,192 bytes)\n--    \u03bb> last (snd (particion6 [1..6*10^6]))\n--    6000000\n--    (1.80 secs, 888,515,960 bytes)\n--    \u03bb> last (snd (particion7 [1..6*10^6]))\n--    6000000\n--    (1.29 secs, 1,166,865,672 bytes)\n--    \u03bb> last (snd (particion8 [1..6*10^6]))\n--    6000000\n--    (0.87 secs, 3,384,516,616 bytes)\n--\n--    \u03bb> last (snd (particion5 [1..10^7]))\n--    10000000\n--    (1.94 secs, 1,720,516,872 bytes)\n--    \u03bb> last (snd (particion7 [1..10^7]))\n--    10000000\n--    (2.54 secs, 1,989,215,176 bytes)\n--    \u03bb> last (snd (particion8 [1..10^7]))\n--    10000000\n--    (1.33 secs, 5,640,516,960 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Separacion_por_posicion.hs\">GitHub<\/a>.<\/p>\n<p>La elaboraci\u00f3n de las soluciones se describe en el siguiente v\u00eddeo<\/p>\n<h4>Nuevas soluciones<\/h4>\n<ul>\n<li>En los comentarios se pueden escribir nuevas soluciones.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=&quot;haskell&quot;&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n particion :: [a] -> ([a],[a]) tal que (particion xs) es el par cuya primera componente son los elementos de xs en posiciones pares y su segunda componente son los restantes elementos. Por ejemplo, particion [3,5,6,2] == ([3,6],[5,2]) particion [3,5,6,2,7] == ([3,6,7],[5,2]) particion \u00abparticion\u00bb == (\u00abpriin\u00bb,\u00bbatco\u00bb) Soluciones module Separacion_por_posicion where import Data.List (partition)&#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":[2],"tags":[41,8,498,543,91,94,544,80,134,28,545,10,92,11,339,90,6,16,146,9],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6930"}],"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=6930"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6930\/revisions"}],"predecessor-version":[{"id":6990,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6930\/revisions\/6990"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6930"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6930"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6930"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}