{"id":402,"date":"2014-07-07T07:00:05","date_gmt":"2014-07-07T05:00:05","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=402"},"modified":"2015-05-01T09:06:47","modified_gmt":"2015-05-01T07:06:47","slug":"ventana-deslizante","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/ventana-deslizante\/","title":{"rendered":"Ventana deslizante"},"content":{"rendered":"<pre lang=\"text\">\n-- Definir la funci\u00f3n\n--    ventanas :: Int -> Int -> [a] -> [[a]]\n-- tal que (ventanas x y zs) es la lista de ventanas de zs de tama\u00f1o x\n-- y deslizamiento y; es decir listas de x elementos consecutivos de zs\n-- (salvo, posiblemente, la \u00faltima que puede ser menor) tales que la\n-- diferencia de posiciones entre los primeros elementos de ventanas\n-- consecutivas es y. Por ejemplo, \n--    ventanas 3 2 [5,1,9,2] == [[5,1,9],[9,2]]\n--    ventanas 3 3 [5,1,9,2] == [[5,1,9],[2]]\n--    ventanas 3 4 [5,1,9,2] == [[5,1,9]]\n--    ventanas 4 1 [1..7]    == [[1,2,3,4],[2,3,4,5],[3,4,5,6],[4,5,6,7]]\n--    ventanas 4 2 [1..7]    == [[1,2,3,4],[3,4,5,6],[5,6,7]]\n--    ventanas 4 3 [1..7]    == [[1,2,3,4],[4,5,6,7]]\n--    ventanas 4 4 [1..7]    == [[1,2,3,4],[5,6,7]]\n--    ventanas 4 5 [1..7]    == [[1,2,3,4],[6,7]]\n--    ventanas 4 6 [1..7]    == [[1,2,3,4],[7]]\n--    ventanas 4 7 [1..7]    == [[1,2,3,4]]\n--    ventanas 4 8 [1..7]    == [[1,2,3,4]]\n--    ventanas 3 2 \"abcdef\"  == [\"abc\",\"cde\",\"ef\"]\n--    ventanas 3 3 \"abcdef\"  == [\"abc\",\"def\"]\n--    ventanas 3 4 \"abcdef\"  == [\"abc\",\"ef\"]\n--    ventanas 3 5 \"abcdef\"  == [\"abc\",\"f\"]\n--    ventanas 3 6 \"abcdef\"  == [\"abc\"]\n--    ventanas 3 7 \"abcdef\"  == [\"abc\"]\n--    ventanas 1 5 \"abcdef\"  == [\"a\",\"f\"]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List\n\n-- 1\u00ba definici\u00f3n (por recursi\u00f3n):\nventanas1 :: Int -> Int -> [a] -> [[a]]\nventanas1 _ _ [] = []\nventanas1 x y zs \n    | length zs <= x = [zs]\n    | otherwise      = take x zs : ventanas1 x y (drop y zs)\n\n-- 2\u00aa definici\u00f3n (con unfold):\nventanas2 :: Int -> Int -> [a] -> [[a]]\nventanas2 x y = unfoldr aux\n  where aux [] = Nothing\n        aux xs = Just (ys,zs)\n                 where (ys,us)        = splitAt x xs\n                       zs | null us   = []\n                          | otherwise = drop y xs\n<\/pre>\n<h3>Referencia<\/h3>\n<p>El ejercicio est\u00e1 basado en el <a href=\"http:\/\/bit.ly\/1thYgmV\">problema del 30 de abril de 2014<\/a> de <a href=\"https:\/\/twitter.com\/1HaskellADay\">1HaskellADay<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8212; Definir la funci\u00f3n &#8212; ventanas :: Int -> Int -> [a] -> [[a]] &#8212; tal que (ventanas x y zs) es la lista de ventanas de zs de tama\u00f1o x &#8212; y deslizamiento y; es decir listas de x elementos consecutivos de zs &#8212; (salvo, posiblemente, la \u00faltima que puede ser menor) tales que&#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":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/402"}],"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=402"}],"version-history":[{"count":14,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/402\/revisions"}],"predecessor-version":[{"id":1411,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/402\/revisions\/1411"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}