{"id":6671,"date":"2022-02-28T06:00:58","date_gmt":"2022-02-28T04:00:58","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6671"},"modified":"2022-03-07T08:17:10","modified_gmt":"2022-03-07T06:17:10","slug":"la-bandera-tricolor","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/la-bandera-tricolor\/","title":{"rendered":"La bandera tricolor"},"content":{"rendered":"<p>El problema de la bandera tricolor consiste en lo siguiente: Dada un lista de objetos xs que pueden ser rojos, amarillos o morados, se pide devolver una lista ys que contiene los elementos de xs, primero los rojos, luego los amarillos y por \u00faltimo los morados.<\/p>\n<p>Definir el tipo de dato Color para representar los colores con los constructores R, A y M correspondientes al rojo, azul y morado y la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   banderaTricolor :: [Color] -> [Color]\n<\/pre>\n<p>tal que (banderaTricolor xs) es la bandera tricolor formada con los elementos de xs. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   bandera [M,R,A,A,R,R,A,M,M]  ==  [R,R,R,A,A,A,M,M,M]\n   bandera [M,R,A,R,R,A]        ==  [R,R,R,A,A,M]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (sort)\nimport Test.QuickCheck (Arbitrary(arbitrary), elements, quickCheck)\n\ndata Color = R | A | M\n  deriving (Show, Eq, Ord, Enum)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nbanderaTricolor1 :: [Color] -> [Color]\nbanderaTricolor1 xs =\n  [x | x <- xs, x == R] ++\n  [x | x <- xs, x == A] ++\n  [x | x <- xs, x == M]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nbanderaTricolor2 :: [Color] -> [Color]\nbanderaTricolor2 xs =\n  colores R ++ colores A ++ colores M\n  where colores c = filter (== c) xs\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nbanderaTricolor3 :: [Color] -> [Color]\nbanderaTricolor3 xs =\n  concat [[x | x <- xs, x == c] | c <- [R,A,M]]\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nbanderaTricolor4 :: [Color] -> [Color]\nbanderaTricolor4 xs = aux xs ([],[],[])\n  where aux []     (rs,as,ms) = rs ++ as ++ ms\n        aux (R:ys) (rs,as,ms) = aux ys (R:rs,   as,   ms)\n        aux (A:ys) (rs,as,ms) = aux ys (  rs, A:as,   ms)\n        aux (M:ys) (rs,as,ms) = aux ys (  rs,   as, M:ms)\n\n-- 5\u00aa soluci\u00f3n\n-- ===========\n\nbanderaTricolor5 :: [Color] -> [Color]\nbanderaTricolor5 = sort\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\ninstance Arbitrary Color where\n  arbitrary = elements [A,R,M]\n\n-- La propiedad es\nprop_banderaTricolor :: [Color] -> Bool\nprop_banderaTricolor xs =\n  all (== banderaTricolor1 xs)\n      [banderaTricolor2 xs,\n       banderaTricolor3 xs,\n       banderaTricolor4 xs,\n       banderaTricolor5 xs]\n\nverifica_banderaTricolor :: IO ()\nverifica_banderaTricolor =\n  quickCheck prop_banderaTricolor\n\n-- La comprobaci\u00f3n es\n--    \u03bb> verifica_banderaTricolor\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> bandera n = concat [replicate n c | c <- [M,R,A]]\n--    \u03bb> length (banderaTricolor1 (bandera (10^6)))\n--    3000000\n--    (1.51 secs, 1,024,454,768 bytes)\n--    \u03bb> length (banderaTricolor1 (bandera (2*10^6)))\n--    6000000\n--    (2.94 secs, 2,048,454,832 bytes)\n--    \u03bb> length (banderaTricolor2 (bandera (2*10^6)))\n--    6000000\n--    (2.35 secs, 1,232,454,920 bytes)\n--    \u03bb> length (banderaTricolor3 (bandera (2*10^6)))\n--    6000000\n--    (4.28 secs, 2,304,455,360 bytes)\n--    \u03bb> length (banderaTricolor4 (bandera (2*10^6)))\n--    6000000\n--    (3.01 secs, 1,904,454,672 bytes)\n--    \u03bb> length (banderaTricolor5 (bandera (2*10^6)))\n--    6000000\n--    (2.47 secs, 1,248,454,744 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Bandera_tricolor.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El problema de la bandera tricolor consiste en lo siguiente: Dada un lista de objetos xs que pueden ser rojos, amarillos o morados, se pide devolver una lista ys que contiene los elementos de xs, primero los rojos, luego los amarillos y por \u00faltimo los morados. Definir el tipo de dato Color para representar los&#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,6,503],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6671"}],"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=6671"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6671\/revisions"}],"predecessor-version":[{"id":6744,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6671\/revisions\/6744"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}