Menu Close

Listas con suma dada

Definir la función

   conSuma :: (Eq a, Num a) => [a] -> [[a]] -> [[[a]]]

tal que (conSuma xs yss) es la lista de los vectores de xss cuya suma vectorial es xs. Por ejemplo,

   ghci> conSuma [9,10,12] [[4,7,3],[3,1,4],[5,3,9],[2,2,5]] 
   [[[4,7,3],[5,3,9]],[[4,7,3],[3,1,4],[2,2,5]]]
   ghci> conSuma [9,11,12] [[4,7,3],[3,1,4],[5,3,9],[2,2,5]] 
   []

Soluciones

import Data.List (subsequences, transpose)
 
conSuma :: (Eq a, Num a) => [a] -> [[a]] -> [[[a]]]
conSuma xs yss = [zss | zss <- subsequences yss, suma zss == xs]
 
-- (suma xss) es la suma de las listas xs. Por ejemplo,
--    suma [[4,7,3],[3,1,4],[2,2,5]]  ==  [9,10,12]
suma :: Num a => [[a]] -> [a]
suma = map sum . transpose
Medio

Una solución de “Listas con suma dada

  1. Eduardo Román
    import Data.List (subsequences)
     
    conSuma :: (Eq a, Num a) => [a] -> [[a]] -> [[[a]]]
    conSuma xs yss = [ys | ys <- subsequences yss, sumaVec ys == xs] 
     
    sumaVec :: Num a => [[a]] -> [a]
    sumaVec xss
        | map length xss == replicate (length xss) 1 = [sum (map head xss)]
    sumaVec xss = sum (map head xss) : sumaVec (map tail xss)
     
    -- sumaVec es la misma que en el anterior ejercicio

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.