{"id":1550,"date":"2015-06-12T06:00:42","date_gmt":"2015-06-12T04:00:42","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=1550"},"modified":"2015-10-28T15:18:50","modified_gmt":"2015-10-28T13:18:50","slug":"mayor-producto-de-n-numeros-adyacentes-en-una-matriz","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/mayor-producto-de-n-numeros-adyacentes-en-una-matriz\/","title":{"rendered":"Mayor producto de n n\u00fameros adyacentes en una matriz"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   mayorProductoAdyacentes :: (Num a, Ord a) => Int -> Matriz a -> [[a]]\n<\/pre>\n<p>tal que (mayorProductoAdyacentes n p) es la lista de los segmentos formados por n elementos adyacentes en la misma fila, columna o diagonal de la matriz p cuyo productos son m\u00e1ximo. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   ghci> mayorProductoAdyacentes 3 (listArray ((1,1),(3,4)) [1..12])\n   [[10,11,12]]\n   ghci> mayorProductoAdyacentes 3 (listArray ((1,1),(3,4)) [1,3,4,5, 0,7,2,1, 3,9,2,1])\n   [[3,7,9]]\n   ghci> mayorProductoAdyacentes 2 (listArray ((1,1),(2,3)) [1,3,4, 0,3,2])\n   [[3,4],[4,3]]\n   ghci> mayorProductoAdyacentes 2 (listArray ((1,1),(2,3)) [1,2,1, 3,0,3])\n   [[2,3],[2,3]]\n   ghci> mayorProductoAdyacentes 2 (listArray ((1,1),(2,3)) [1,2,1, 3,4,3])\n   [[3,4],[4,3]]\n   ghci> mayorProductoAdyacentes 2 (listArray ((1,1),(2,3)) [1,5,1, 3,4,3])\n   [[5,4]]\n   ghci> mayorProductoAdyacentes 3 (listArray ((1,1),(3,4)) [1,3,4,5, 0,7,2,1, 3,9,2,1])\n   [[3,7,9]]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Array\n\ntype Matriz a = Array (Int,Int) a\n\nmayorProductoAdyacentes :: (Num a, Ord a) => Int -> Matriz a -> [[a]]\nmayorProductoAdyacentes n p = \n    [xs | xs <- segmentos, product xs == m]\n    where segmentos = adyacentes n p \n          m         = maximum (map product segmentos)\n\n-- (adyacentes n p) es la lista de los segmentos de longitud n de las\n-- l\u00edneas de la matriz p. Por ejemplo,\n--    ghci> adyacentes 3 (listArray ((1,1),(3,4)) [1..12])\n--    [[1,2,3],[2,3,4],[5,6,7],[6,7,8],[9,10,11],[10,11,12],[1,5,9],\n--     [2,6,10],[3,7,11],[4,8,12],[1,6,11],[2,7,12],[3,6,9],[4,7,10]]\nadyacentes :: Num a => Int -> Matriz a -> [[a]]\nadyacentes n p = concatMap (segmentos n) (lineas p)\n\n-- (lineas p) es la lista de las l\u00edneas de la matriz p. Por ejemplo, \n--    ghci> lineas (listArray ((1,1),(3,4)) [1..12])\n--    [[1,2,3,4],[5,6,7,8],[9,10,11,12],\n--     [1,5,9],[2,6,10],[3,7,11],[4,8,12],\n--     [9],[5,10],[1,6,11],[2,7,12],[3,8],[4],\n--     [1],[2,5],[3,6,9],[4,7,10],[8,11],[12]]\nlineas :: Num a => Matriz a -> [[a]]\nlineas p = filas p ++ \n           columnas p ++ \n           diagonalesPrincipales p ++\n           diagonalesSecundarias p\n\n-- (filas p) es la lista de las filas de la matriz p. Por ejemplo,\n--    ghci> filas (listArray ((1,1),(3,4)) [1..12])\n--    [[1,2,3,4],[5,6,7,8],[9,10,11,12]]\nfilas :: Num a => Matriz a -> [[a]]\nfilas p = [fila i p | i <- [1..m]]\n    where (_,(m,_)) = bounds p\n\n-- (fila i p) es la fila i-\u00e9sima de la matriz p. Por ejemplo, \n--    fila 2 (listArray ((1,1),(3,4)) [1..12])  ==  [5,6,7,8]\nfila :: Num a => Int -> Matriz a -> [a]\nfila i p = [p!(i,j) | j <- [1..n]]\n    where (_,(_,n)) = bounds p\n\n-- (columnas p) es la lista de las columnas de la matriz p. Por ejemplo,\n--    ghci> columnas (listArray ((1,1),(3,4)) [1..12])\n--    [[1,5,9],[2,6,10],[3,7,11],[4,8,12]]\ncolumnas :: Num a => Matriz a -> [[a]]\ncolumnas p = [columna j p | j <- [1..n]]\n    where (_,(_,n)) = bounds p\n\n-- (columna j p) es la columna j-\u00e9sima de la matriz p. Por ejemplo, \n--    columna 2 (listArray ((1,1),(3,4)) [1..12])  ==  [2,6,10]\ncolumna :: Num a => Int -> Matriz a -> [a]\ncolumna j p = [p!(i,j) | i <- [1..m]]\n    where (_,(m,_)) = bounds p\n\n-- (diagonalesPrincipales p) es la lista de las diagonales principales\n-- de p. Por ejemplo, \n--    ghci> diagonalesPrincipales (listArray ((1,1),(3,4)) [1..12])\n--    [[9],[5,10],[1,6,11],[2,7,12],[3,8],[4]]\ndiagonalesPrincipales :: Matriz a -> [[a]]\ndiagonalesPrincipales p = \n    [[p!ij1 | ij1 <- extension ij] | ij <- iniciales] \n    where (_,(m,n)) = bounds p\n          iniciales = [(i,1) | i <- [m,m-1..2]] ++ [(1,j) | j <- [1..n]] \n          extension (i,j) = [(i+k,j+k) | k <- [0..min (m-i) (n-j)]]\n\n-- (diagonalesSecundarias p) es la lista de las diagonales secundarias\n-- de p. Por ejemplo, \n--    ghci> diagonalesSecundarias (listArray ((1,1),(3,4)) [1..12])\n--    [[1],[2,5],[3,6,9],[4,7,10],[8,11],[12]]\ndiagonalesSecundarias p = \n    [[p!ij1 | ij1 <- extension ij] | ij <- iniciales]\n    where (_,(m,n)) = bounds p\n          iniciales = [(1,j) | j <- [1..n]] ++ [(i,n) | i <- [2..m]] \n          extension (i,j) = [(i+k,j-k) | k <- [0..min (j-1) (m-i)]]\n\n-- (segmentos n xs) es la lista de los segmentos de longitud n de la\n-- lista xs. Por ejemplo, \n--    segmentos 3 [1..5]  ==  [[1,2,3],[2,3,4],[3,4,5]]\nsegmentos :: Int -> [a] -> [[a]]\nsegmentos n xs \n    | length xs < n = []\n    | otherwise     = take n xs : segmentos n (tail xs)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n mayorProductoAdyacentes :: (Num a, Ord a) => Int -> Matriz a -> [[a]] tal que (mayorProductoAdyacentes n p) es la lista de los segmentos formados por n elementos adyacentes en la misma fila, columna o diagonal de la matriz p cuyo productos son m\u00e1ximo. Por ejemplo, ghci> mayorProductoAdyacentes 3 (listArray ((1,1),(3,4)) [1..12])&#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":[7],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1550"}],"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=1550"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1550\/revisions"}],"predecessor-version":[{"id":1651,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1550\/revisions\/1651"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=1550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=1550"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=1550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}