0votos

función resuelveSumas en Haskell

por josejuan hace 5 años

Una directa en Haskell.

programar, utilizando Hugs una función resuelveSumas que dada una tupla formada por una lista de resultados y una lista de sumandos, devuelva una cadena de caracteres indicando si el problema tiene solución y si ésta es única o no.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import Data.List 
 
-- Supone xs está ordenado asc 
sumWays _     [] = [] 
sumWays n (x:xs) | n == x = subWays ++ [([x], xs)] 
                 | n  < x = [] 
                 | n  > x = subWays ++ map (\(ys, zs) -> (x:ys, zs)) (sumWays (n - x) xs) 
                 where subWays = map (\(ys, zs) -> (ys, x:zs)) (sumWays n xs) 
 
-- Cualquier número de sumando y devuelve todas las soluciones (aun equivalentes) 
sumWaysThen [] [] = [[]] 
sumWaysThen []  _ = [] 
sumWaysThen (n:ns) xs = concatMap (\(ys, zs) -> map (ys:) $ sumWaysThen ns zs) $ sumWays n xs 
 
-- Sólo con longitud fija de sumandos 
sumWaysFixedSums size ns xs = filter (all ((size==).length)) $ sumWaysThen ns xs 
 
-- Muestra soluciones 
showEq xs = show (sum xs) ++ " = " ++ intercalate " + " (map show xs) 
showSums = map showEq 
showSolutions = mapM_ putStrLn . nub -- << nub para todas o sólo equivalentes 
                               . map (unlines.showSums) 
            
 
{- 
 
    Por ejemplo: 
   
    *Main> showSolutions $ sumWaysFixedSums 2 [6,7,8,10] [1,2,3,4,5,5,5,6] 
    6 = 2 + 4 
    7 = 1 + 6 
    8 = 3 + 5 
    10 = 5 + 5 
 
    6 = 1 + 5 
    7 = 3 + 4 
    8 = 2 + 6 
    10 = 5 + 5 
 
    6 = 1 + 5 
    7 = 2 + 5 
    8 = 3 + 5 
    10 = 4 + 6   
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.