{"id":567,"date":"2014-11-13T07:05:57","date_gmt":"2014-11-13T05:05:57","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=567"},"modified":"2014-12-27T21:41:29","modified_gmt":"2014-12-27T19:41:29","slug":"repeticion-de-elementos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/repeticion-de-elementos\/","title":{"rendered":"Repetici\u00f3n de elementos"},"content":{"rendered":"<h4>Enunciado<\/h4>\n<pre lang=\"text\">\n-- Definir la funci\u00f3n\n--    repiteElementos :: Int -> [a] -> [a]\n-- tal que (repiteElementos k xs) es la lista obtenida repitiendo cada\n-- elemento de xs k veces. Por ejemplo,\n--    repiteElementos 3 [5,2,7,4]  ==  [5,5,5,2,2,2,7,7,7,4,4,4]\n--\n-- Comprobar con QuickCheck que, para todo n\u00famero natural k y toda lista\n-- xs, el n\u00famero de elementos de (repiteElementos k xs) es k veces el\n-- n\u00famero de elementos de xs.\n--\n-- Nota. Al hacer la comprobaci\u00f3n limitar el tama\u00f1o de las pruebas como\n-- se indica a continuaci\u00f3n\n--    ghci> quickCheckWith (stdArgs {maxSize=7}) prop_repiteElementos\n--    +++ OK, passed 100 tests.\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck\n\n-- 1\u00aa definici\u00f3n (por comprensi\u00f3n):\nrepiteElementos1 :: Int -> [a] -> [a]\nrepiteElementos1 k xs = concat [replicate k x | x <- xs]\n\n-- 2\u00aa definici\u00f3n (con map)\nrepiteElementos2 :: Int -> [a] -> [a]\nrepiteElementos2 k xs = concat (map (replicate k) xs)\n\n-- 3\u00aa definici\u00f3n (con concatMap):\nrepiteElementos3 :: Int -> [a] -> [a]\nrepiteElementos3 k = concatMap (replicate k)\n\n-- 4\u00aa definici\u00f3n (por recursi\u00f3n):\nrepiteElementos4 :: Int -> [a] -> [a]\nrepiteElementos4 k [] = []\nrepiteElementos4 k (x:xs) = replicate k x ++ repiteElementos4 k xs\n\n-- 5\u00aa definici\u00f3n (por plegado):\nrepiteElementos5 :: Int -> [a] -> [a]\nrepiteElementos5 k = foldr ((++) . replicate k) []\n\n-- Propiedad de equivalencia\nprop_equivalencia :: Int -> [Int] -> Bool\nprop_equivalencia k xs =\n    repiteElementos2 k xs == ys &&\n    repiteElementos3 k xs == ys &&\n    repiteElementos4 k xs == ys &&\n    repiteElementos5 k xs == ys \n    where ys = repiteElementos1 k xs\n\n-- Su comprobaci\u00f3n es\n--    ghci> quickCheckWith (stdArgs {maxSize=10}) prop_equivalencia\n--    +++ OK, passed 100 tests.\n\n-- La propiedad es\nprop_repiteElementos :: Int -> [Int] -> Property\nprop_repiteElementos k xs =\n    k >= 0 ==> length (repiteElementos1 k xs) == k * length xs \n\n-- La comprobaci\u00f3n es\n--    ghci> quickCheckWith (stdArgs {maxSize=7}) prop_repiteElementos\n--    +++ OK, passed 100 tests.\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Enunciado &#8212; Definir la funci\u00f3n &#8212; repiteElementos :: Int -> [a] -> [a] &#8212; tal que (repiteElementos k xs) es la lista obtenida repitiendo cada &#8212; elemento de xs k veces. Por ejemplo, &#8212; repiteElementos 3 [5,2,7,4] == [5,5,5,2,2,2,7,7,7,4,4,4] &#8212; &#8212; Comprobar con QuickCheck que, para todo n\u00famero natural k y toda lista &#8212; xs,&#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":[5],"tags":[8,12,58,94,28,10,11,90,19,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/567"}],"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=567"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/567\/revisions"}],"predecessor-version":[{"id":741,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/567\/revisions\/741"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}