{"id":437,"date":"2014-07-09T07:00:37","date_gmt":"2014-07-09T05:00:37","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=437"},"modified":"2022-03-26T12:13:41","modified_gmt":"2022-03-26T10:13:41","slug":"elemento-mas-cercano-que-cumple-una-propiedad","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/elemento-mas-cercano-que-cumple-una-propiedad\/","title":{"rendered":"Elemento m\u00e1s cercano que cumple una propiedad"},"content":{"rendered":"<pre lang=\"text\">\n-- Definir la funci\u00f3n\n--    cercano :: (a -> Bool) -> Int -> [a] -> Maybe a\n-- tal que (cercano p n xs) es el elemento de xs m\u00e1s cercano a n que\n-- verifica la propiedad p. La b\u00fasqueda comienza en n y los elementos se\n-- analizan en el siguiente orden: n, n+1, n-1, n+2, n-2,... Por ejemplo, \n--    cercano (`elem` \"aeiou\") 6 \"Sevilla\"     ==  Just 'a'\n--    cercano (`elem` \"aeiou\") 1 \"Sevilla\"     ==  Just 'e'\n--    cercano (`elem` \"aeiou\") 2 \"Sevilla\"     ==  Just 'i'\n--    cercano (`elem` \"aeiou\") 5 \"Sevilla\"     ==  Just 'a'\n--    cercano (`elem` \"aeiou\") 9 \"Sevilla\"     ==  Just 'a'\n--    cercano (`elem` \"aeiou\") (-3) \"Sevilla\"  ==  Just 'e'\n--    cercano (>100) 4 [200,1,150,2,4]         ==  Just 150\n--    cercano even 5 [1,3..99]                 ==  Nothing\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\ncercano1 :: (a -> Bool) -> Int -> [a] -> Maybe a\ncercano1 p n xs | null ys   = Nothing\n                | otherwise = Just (head ys)\n    where ys = filter p (ordenaPorCercanos xs n)\n\n-- (ordenaPorCercanos xs n) es la lista de los elementos de xs que\n-- ocupan las posiciones n, n+1, n-1, n+2, n-2... Por ejemplo, \n--    ordenaPorCercanos [0..9] 4     ==  [4,5,3,6,2,7,1,8,0,9]\n--    ordenaPorCercanos [0..9] 7     ==  [7,8,6,9,5,4,3,2,1,0]\n--    ordenaPorCercanos [0..9] 2     ==  [2,3,1,4,0,5,6,7,8,9]\n--    ordenaPorCercanos [0..9] (-3)  ==  [0,1,2,3,4,5,6,7,8,9]\n--    ordenaPorCercanos [0..9] 20    ==  [9,8,7,6,5,4,3,2,1,0]\nordenaPorCercanos :: [a] -> Int -> [a]\nordenaPorCercanos xs n \n    | n < 0          = xs\n    | n >= length xs = reverse xs\n    | otherwise      = z : intercala zs (reverse ys)\n    where (ys,(z:zs)) = splitAt n xs\n\n-- (intercala xs ys) es la lista obtenida intercalando los elementos de\n-- las lista xs e ys. Por ejemplo,\n--    intercala [1..4] [5..10]   ==  [1,5,2,6,3,7,4,8,9,10]\n--    intercala [5..10] [1..4]   ==  [5,1,6,2,7,3,8,4,9,10]\nintercala :: [a] -> [a] -> [a]\nintercala [] ys = ys\nintercala xs [] = xs\nintercala (x:xs) (y:ys) = x : y : intercala xs ys\n\n-- 2\u00aa soluci\u00f3n (usando find)\n-- =========================\n\ncercano2 :: (a -> Bool) -> Int -> [a] -> Maybe a\ncercano2 p n xs = find p (ordenaPorCercanos xs n)\n<\/pre>\n<h4>Referencia<\/h4>\n<p>El ejercicio est\u00e1 basado en el <a href=\"http:\/\/bit.ly\/1mcAZOz\">problema del 12 de mayo<\/a> de <a href=\"https:\/\/twitter.com\/1HaskellADay\">1HaskellADay<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8212; Definir la funci\u00f3n &#8212; cercano :: (a -> Bool) -> Int -> [a] -> Maybe a &#8212; tal que (cercano p n xs) es el elemento de xs m\u00e1s cercano a n que &#8212; verifica la propiedad p. La b\u00fasqueda comienza en n y los elementos se &#8212; analizan en el siguiente orden: n,&#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":[4],"tags":[500,38,135,71,28,11,6,32,73],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/437"}],"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=437"}],"version-history":[{"count":9,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/437\/revisions"}],"predecessor-version":[{"id":668,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/437\/revisions\/668"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}