{"id":6667,"date":"2022-02-24T06:00:46","date_gmt":"2022-02-24T04:00:46","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6667"},"modified":"2022-03-03T08:08:45","modified_gmt":"2022-03-03T06:08:45","slug":"iguales-al-siguiente","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/iguales-al-siguiente\/","title":{"rendered":"Iguales al siguiente"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   igualesAlSiguiente :: Eq a => [a] -> [a]\n<\/pre>\n<p>tal que (igualesAlSiguiente xs) es la lista de los elementos de xs que son iguales a su siguiente. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   igualesAlSiguiente [1,2,2,2,3,3,4]  ==  [2,2,3]\n   igualesAlSiguiente [1..10]          ==  []\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (group)\nimport Test.QuickCheck (quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente1 :: Eq a => [a] -> [a]\nigualesAlSiguiente1 xs =\n  [x | (x, y) <- consecutivos1 xs, x == y]\n\n-- (consecutivos1 xs) es la lista de pares de elementos consecutivos en\n-- xs. Por ejemplo,\n--    consecutivos1 [3,5,2,7]  ==  [(3,5),(5,2),(2,7)]\nconsecutivos1 :: [a] -> [(a, a)]\nconsecutivos1 xs = zip xs (tail xs)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente2 :: Eq a => [a] -> [a]\nigualesAlSiguiente2 xs =\n  [x | (x,y) <- consecutivos2 xs, x == y]\n\n-- (consecutivos2 xs) es la lista de pares de elementos consecutivos en\n-- xs. Por ejemplo,\n--    consecutivos2 [3,5,2,7]  ==  [(3,5),(5,2),(2,7)]\nconsecutivos2 :: [a] -> [(a, a)]\nconsecutivos2 (x:y:zs) = (x,y) : consecutivos2 (y:zs)\nconsecutivos2 _        = []\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente3 :: Eq a => [a] -> [a]\nigualesAlSiguiente3 (x:y:zs) | x == y    = x : igualesAlSiguiente3 (y:zs)\n                             | otherwise = igualesAlSiguiente3 (y:zs)\nigualesAlSiguiente3 _                    = []\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente4 :: Eq a => [a] -> [a]\nigualesAlSiguiente4 xs = concat [ys | (_:ys) <- group xs]\n\n-- 5\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente5 :: Eq a => [a] -> [a]\nigualesAlSiguiente5 xs = concat (map tail (group xs))\n\n-- 6\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente6 :: Eq a => [a] -> [a]\nigualesAlSiguiente6 xs = tail =<< group xs\n\n-- 7\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente7 :: Eq a => [a] -> [a]\nigualesAlSiguiente7 = (tail =<<) . group\n\n-- 8\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente8 :: Eq a => [a] -> [a]\nigualesAlSiguiente8 xs = concatMap tail (group xs)\n\n-- 9\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente9 :: Eq a => [a] -> [a]\nigualesAlSiguiente9 = concatMap tail . group\n\n-- 10\u00aa soluci\u00f3n\n-- ===========\n\nigualesAlSiguiente10 :: Eq a => [a] -> [a]\nigualesAlSiguiente10 xs = aux xs (tail xs)\n  where aux (u:us) (v:vs) | u == v    = u : aux us vs\n                          | otherwise = aux us vs\n        aux _ _ = []\n\n-- Equivalencia de las definiciones\n-- ================================\n\n-- La propiedad es\nprop_igualesAlSiguiente :: [Int] -> Bool\nprop_igualesAlSiguiente xs =\n  all (== igualesAlSiguiente1 xs)\n      [igualesAlSiguiente2 xs,\n       igualesAlSiguiente3 xs,\n       igualesAlSiguiente4 xs,\n       igualesAlSiguiente5 xs,\n       igualesAlSiguiente6 xs,\n       igualesAlSiguiente7 xs,\n       igualesAlSiguiente8 xs,\n       igualesAlSiguiente9 xs,\n       igualesAlSiguiente10 xs]\n\nverificacion :: IO ()\nverificacion = quickCheck prop_igualesAlSiguiente\n\n-- La comprobaci\u00f3n es\n--    \u03bb> verificacion\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    > ej = concatMap show [1..10^6]\n--    (0.01 secs, 446,752 bytes)\n--    \u03bb> length ej\n--    5888896\n--    (0.16 secs, 669,787,856 bytes)\n--    \u03bb> length (show (igualesAlSiguiente1 ej))\n--    588895\n--    (1.60 secs, 886,142,944 bytes)\n--    \u03bb> length (show (igualesAlSiguiente2 ej))\n--    588895\n--    (1.95 secs, 1,734,143,816 bytes)\n--    \u03bb> length (show (igualesAlSiguiente3 ej))\n--    588895\n--    (1.81 secs, 1,178,232,104 bytes)\n--    \u03bb> length (show (igualesAlSiguiente4 ej))\n--    588895\n--    (1.43 secs, 1,932,010,304 bytes)\n--    \u03bb> length (show (igualesAlSiguiente5 ej))\n--    588895\n--    (0.40 secs, 2,016,810,320 bytes)\n--    \u03bb> length (show (igualesAlSiguiente6 ej))\n--    588895\n--    (0.32 secs, 1,550,409,984 bytes)\n--    \u03bb> length (show (igualesAlSiguiente7 ej))\n--    588895\n--    (0.34 secs, 1,550,410,104 bytes)\n--    \u03bb> length (show (igualesAlSiguiente8 ej))\n--    588895\n--    (0.33 secs, 1,550,410,024 bytes)\n--    \u03bb> length (show (igualesAlSiguiente9 ej))\n--    588895\n--    (0.33 secs, 1,550,450,968 bytes)\n--    \u03bb> length (show (igualesAlSiguiente10 ej))\n--    588895\n--    (1.54 secs, 754,272,600 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Iguales_al_siguiente.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n igualesAlSiguiente :: Eq a => [a] -> [a] tal que (igualesAlSiguiente xs) es la lista de los elementos de xs que son iguales a su siguiente. Por ejemplo, igualesAlSiguiente [1,2,2,2,3,3,4] == [2,2,3] igualesAlSiguiente [1..10] == [] Soluciones import Data.List (group) import Test.QuickCheck (quickCheck) &#8212; 1\u00aa soluci\u00f3n &#8212; =========== igualesAlSiguiente1 :: Eq a&#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":[8,498,497,6],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6667"}],"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=6667"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6667\/revisions"}],"predecessor-version":[{"id":6731,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6667\/revisions\/6731"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}