Ir al contenido principal

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,

λ> 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]]]
λ> 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